設計模式 Factory

2021-08-06 06:28:47 字數 2575 閱讀 8808

工廠模式(factory pattern)是最常用的設計模式之一。

它屬於建立型模式,提供了一種很好的建立物件的方法。

首先看乙個例子。

在類繼承過程中,我們經常將一些類的公共介面抽象出來形成乙個基類,方法用virtual關鍵字修飾。利用多型性,我們可以宣告乙個基類指標,通過指向實際的子類來實現不同的功能。

class shape;};

class circle : public shape

;class square : public shape

;void circle::draw()

;class shapefactory

;shape *shapefactory::createshape(enum shapetype type)

這樣,我們就可以通過這個工廠類的createshape()方法進行不同物件的建立。

shapefactory *shapefactory =

new shapefactory();

shape *shape1 = shapefactory->createshape(circle);

shape1->draw();

shape *shape2 = shapefactory->createshape(square);

shape2->draw();

輸出結果為:

createshape in shapefactory

this

is a constructor for shape

this

is a constructor for circle

draw a circle

createshape in shapefactory

this

is a constructor for shape

this

is a constructor for square

draw a square

這樣,就能實現方便地建立物件。

另外,還有一種情況,在父類中我們並不知道具體要例項化哪乙個子類,但是在這個父類的子類中我們可以知道,因此我們就需要把例項化物件的過程推遲到子類裡面實現。

還是剛才那個例子,在shapefactory中,我們不知道要具體進行例項化的子類的名字,但是在shapefactory的子類中可以知道,因此,我們把例項化的過程放到shapefactory的子類中去實現。

class shapefactory

;class myfactory : public shapefactory

;shape *myfactory::createshape(enum shapetype type)

我們將shapefactory中的createshape()方法定義為乙個虛函式,然後寫乙個myfactory繼承自shapefactory,並實現了父類的建立物件方法。

myfactory *myfactory =

new myfactory();

shape * shape1 = myfactory->createshape(circle);

shape1->draw();

shape *shape2 = myfactory->createshape(square);

shape2->draw();

同樣的方法,用子類去建立物件,結果輸出為:

createshape in myfactory

this

is a constructor for shape

this

is a constructor for circle

draw a circle

createshape in myfactory

this

is a constructor for shape

this

is a constructor for square

draw a square

對上面兩種用法總結一下,也即factory模式兩個最重要的功能:

factory模式在實際開發中應用非常廣泛。

物件導向的系統經常面臨著各種物件建立問題,而建的類實在是太多了。而factory提供的建立物件的介面封裝和推遲類的例項化過程很好地解決了部分問題。它遮蔽了建立物件過程的具體實現,只提供乙個對外介面,只需要知道對應引數就可以進行物件建立,而且擴充套件也很方便,只需要擴充套件工廠類就可以了。

但是,factory模式也會帶來一些問題。

當我們需要建立乙個新型別的物件時,需要擴充套件工廠類,這就使得工廠類介面永遠不能封閉。當然可以通過建立工廠類的子類通過多型來實現,但是這又引入了乙個新的類,增加了系統的複雜性。

擴充套件:

factory模式為開發者提供了很好的物件建立的實現策略,但是它僅僅侷限於乙個類族,也即這些建立物件的子類擁有乙個共同的基類,當我們要實現為不同類提供物件建立介面時,就需要用到 abstractfactory模式了。

本文的例子:

設計模式 Factory

有一定程式設計經驗的xdjm對工廠方法模式肯定不會陌生了,曾經做過乙個遊戲大廳,那會的qt還沒有qml這個東東,為了能夠動態的載入頁面以及更加方便的除錯。每乙個window都是使用乙個xml去定義,裡面按照樹狀結構定義了各種型別的控制項。每個控制項都是widget的父類,window在載入介面時顯然...

設計模式 FACTORY

部落格 系統的產品有多於乙個的產品族,而系統只消費其中某一族的產品 主要是解耦,降低後面維護成本,只需修改工廠實現,不要在各呼叫地方修改 其實工廠模式網上一大堆例子根據不同場景各種實現方案,主要是要理解工廠模式的思想 public class factory private shape shape ...

設計模式 工廠模式(Factory)

除了使用new關鍵字以外,還有更多製造物件的方法。new意味著在例項化乙個具體的類,所以物件的方法是準確的實現,而非抽象的方法定義。因此這樣一來 將會缺乏彈性。我們針對介面程式設計,可以隔離掉以後系統中可能發生的一大堆改變,如果 針對介面來寫,那麼對於乙個方法的實現將會是多種多樣的。當 使用大量具體...