定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類
//核心介面所在,該方法定義產品生成
virtual product*factorymethod() = 0;
virtual ~creator() = 0;
class concretecreator:public creator
public:
product * creatproduct()
retun new concreteproduct();
在2中實現的工廠方法中,因為具體的工廠生產product都是特定在create函式中實現的。所以當concreteproduct 型別增多時,可能就需要決策具體例項化哪個product了
那麼,解決方案可以是
①給createproduct增加引數進行決策;
product *concretecreator::creatproduct(int index)
switch(index)
case 1:
return concreteproduct1();
break;
case 2:
return concreteproduct2();
break;
②利用模板方法,由使用者需求決定具體的例項化物件型別。
template
product *concretecreator::creatproduct()
return t();
①優點:
良好封裝,建立產品只需要知道型別就好,具體建立由工廠返回
擴充套件性強,當產品型別增多,**整體結構並沒有太大變化。「擁抱變化」
遮蔽產品類,呼叫者只需要知道產品介面就好
典型的解耦框架。高層只需要知道產品的抽象類,符合迪公尺特法則,依賴倒置原則,黎克特制替換原則
①他是new產品的乙個替代品
②需要靈活地,可擴充套件的框架是,考慮工廠模式
③在異構專案中,可以通過工廠模式實現系統同構化,只需要關進具體的介面接合問題
④在測試驅動開發的框架中。可以通過工廠方法將具體測試者所依賴的其他類虛擬出來,從而避免耦合
① 縮小為簡單工廠模式
方案:工廠模式:有不同的工廠車間繼承自抽象工廠基類,為生產不同產品而執行。或者如上通過引數傳遞確定生產產品型別
簡單工廠:只生產一種商品的工廠。
所以這時的工廠就應當是具體的某乙個concretefactory,而不用虛擬工廠存在
②公升級為多個工廠類
描述:以上所說由引數或者模板方法確定具體產品型別所指是乙個可以生產多種相關產品的工廠了(不同車間生產)
那麼要做到單一職責--乙個工廠只生產一種特定產品,就應當將車間等級提公升為工廠了。這就是多工廠了
實現變動:
//兩種產品
class concreteproduct1:public product{};
class concreteproduct2:public product{};
class concretecreator1:public creator
public:
product concreteproduct1* creatorproduct()
return new concreteproduct1();
class concretecreator2:public creator
public:
product concreteproduct2* creatorproduct()
return new concreteproduct2();
③替換單例模式
描述:因為單例模式擁有,介面少,擴充套件性差的缺點,而我們的工廠模式又恰好擁有這個特點。那麼將之接合,兩全其美
實現:class singleton
//保證工廠方法可以呼叫其建構函式進行初始化
friend class singletonfactory;
protected:
singleton(){}
public:
void dosomething()
class singletonfactory
private:
//包裝單例的指標,外部所得永遠為這乙個指標。具體的單例確定:raii(資源獲取即初始化)
static singleton *_singleton;
public:
static singleton* getsingleton()
return _singleton;
singleton * singletonfactory::_singleton = new singleton();
④延遲初始化/最大連線數問題
問題舉例:在系統中,因為資源及cpu限制,往往會有資料庫連線數量max限制。而連線的資料庫型別又可能不一致type1,2,3........。
看到這個,我們可能會想到多例模式。但是這個問題又存在資料庫型別不一致問題了。
於是就找到工廠方法了。
實現:class productfactory
private:
static mapprmap = new hashmap();//用於已經連線資料庫的儲存
public:
static product newconnection(string type)
product pr = null;
if(prmap.hasconnention(type))
pr = prmap.get(type);
else
//確定型別
switch(type)
case typepr
pr = new (typepr);
prmap.put(typepr);
return pr;
注:以上**並非可執行的
補充:工廠模式的偉大,可以和其他模式混合使用:單例,模板方法,原型模式等。
設計模式C 實現 工廠方法模式
工廠方法模式定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。creator是乙個類,它實現了全部操縱產品的方法,但不實現工廠方法。creator的全部子類都必須實現工廠方法 factorymethod 以實際製造出產品。全部的產品必須實現product基類...
設計模式之工廠方法模式 C 實現
更多設計模式參看 設計模式之模式概述 模式彙總 c 實現 模式結構 示例 簡單工廠模式中,factory類中有一組 if 分支判斷邏輯,由於這個分支判斷邏輯當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的源 將違背 開閉原則 是不是應該用多型或其他...
C 設計模式 工廠方法
定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法 factory method 使乙個類的例項化延遲到其子類。也叫虛構造器 virtual constructor 結構 理解 1.product 是工廠方法生產產品的抽象基類。2.creator 是生產產品的工廠物件抽象基類。cr...