定義
定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法(factory method
)使乙個類的例項化延遲到其子類。也叫虛構造器(virtual constructor )
結構
理解
1.product
是工廠方法生產產品的抽象基類。
2.creator
是生產產品的工廠物件抽象基類。creator
提供建立虛方法即工廠方法
factorymeothod()
。factorymeothod()
由派生類(concretecreator
)具體實現,生產對應的具體產品(concreteproduct
)。 3.concreteproduct
是繼承product
的具體產品。
4.concretecreator
是生產對應具體產品(concreteproduct
)的具體工廠。它重新實現繼承的工廠方法factorymeothod()
,生產具體產品。
要點
1.工廠方法模式中,工廠和產品的基類和派生類是平行關係。抽象產品(product
)對應層次是抽象工廠(creator
)。在派生類層次,每個具體產品(concreteproduct
)對應乙個具體工廠(concretecreator
)。換句話說,每新增乙個具體產品,就要新增乙個對應的具體工廠。 2.
工廠方法的核心是factorymeothod()
,每個具體工廠都重新實現該介面,產生具體類物件。 3.
工廠方法分離客戶端和具體類的實現。利用子類(即具體工廠),讓子類來決定如何來生產乙個具體產品。這樣,客戶端(即呼叫者)只需要知道這個類的抽象型別,由子類去和具體產品類打交道。 4.
工廠基類中的方法anoperation()
,不是工廠方法,只是供具體工廠實現的公共介面(可以說是工廠對產品的使用行為)。但個人認為,工廠方法只是生產產品,公共介面的重點應該是產品,因此在產品基類裡增加產品使用的公共介面更加實用。 5.
工廠方法模式的工廠(creator
)若要全域性唯一,可以結合單件(singleton
)模式應用。 6.
關於簡單工廠
(也叫靜態工廠
)。工廠方法強調的是「讓子類決定例項化什麼樣的物件」,因為子類知道它們要使用的特定產品。如果我們將creator
和concretecreator
的角色合一,並且將工廠方法factorymeothod()
靜態化,那麼就退化成了簡單工廠模式。
應用
1.工廠方法應用場景:
當乙個類不知道它所必須建立的物件的類的時候。
當乙個類希望由它的子類來指定它所建立的物件的時候。
當類將建立物件的職責委託給多個幫助子類中的某乙個,並且你希望將哪乙個幫助子類是**者這一資訊區域性化的時候。(往往放在抽象產品側)
2.loki
庫中對工廠方法有乙個比較完美的實現,結合了函式物件(functor
),可制定產品建立方法。可參見:
3.原始碼中的應用
cosproduct
是產品基類。並且有產品的公共使用介面。
coscreator
是工廠基類。模式結構中的產品使用行為介面anoperaion
並沒有出現在工廠基類介面中,放在了產品側(start
介面)。
具體工廠可以通過繼承coscreator
實現,有多少個具體工廠,就要有多少個具體工廠類。通過c++
模板可以避免建立多個具體工廠(模板類cconcretecreator
)。 原始碼
#include
#include
using
namespace
std;
///產品
class
cosproduct;
// 產品的公共介面。相當於
anoperation
virtual
void
start() = 0; };
class
cwindowsproduct : public
cosproduct };
class
clinuxproduct : public
cosproduct };
///工廠基類
class
coscreator;
// 工廠方法。生產產品
virtual
cosproduct* create() = 0; };
///具體工廠
class
cwindowscreator : public
coscreator;
}; class
clinuxcreator : public
coscreator;
}; /另一種具體工廠:使用模板避免建立多個具體工廠子類
template
t>
class
cconcretecreator : public
coscreator;
virtual
cosproduct* create() ;
protected:
string
m_strproducttype; };
intmain()
輸出:
create windows…
windows start.
create linux…
linux start.
concretecreator. product type: windows
windows start.
concretecreator. product type: linux
linux start.
C 設計模式 工廠方法
定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法 factory method 使乙個類的例項化延遲到其子類。也叫虛構造器 virtual constructor 結構 理解 1.product 是工廠方法生產產品的抽象基類。2.creator 是生產產品的工廠物件抽象基類。cr...
C 設計模式 工廠方法模式
問題描述 之前講到了c 設計模式 簡單工廠模式,由於簡單工廠模式的侷限性,比如 工廠現在能生產producta productb和productc三種產品了,此時,需要增加生產productd產品 那麼,首先是不是需要在產品列舉型別中新增新的產品型別標識,然後,修改factory類中的switch結...
C 設計模式 工廠方法模式
問題描述 之前講到了c 設計模式 簡單工廠模式,由於簡單工廠模式的侷限性,比如 工廠現在能生產producta productb和productc三種產品了,此時,需要增加生產productd產品 那麼,首先是不是需要在產品列舉型別中新增新的產品型別標識,然後,修改factory類中的switch結...