最近寫大**實在無聊,所以決定每天閒暇時學習一種設計模式,主要參考:設計模式:可復用物件導向的軟體基礎一書、設計模式精解-gof23種設計模式解析附c++實現原始碼,還有的部落格(很多圖是來自這裡)。還是一樣,邊學邊整理,方便日後檢視。
簡單工廠模式:
這個實現比較簡單,factory類直接就建立產品,需要指名產品型別,type為a就建立a產品,為b就建立b產品,適用於工廠類負責建立的物件比較少,createproduct中邏輯簡單。這種簡單的做法存在一些問題:
factory模型可以解決這些問題:
1)在父類中並不知道具體要例項化哪乙個具體的子類:factory,product兩個抽象基類,寶馬工廠建立寶馬產品,奧迪工廠生產奧迪汽車,我們在factory基類中不知道到底要建立哪個產品,因此,需要將具體化類的工作延遲到子類中。
2)定義建立物件的介面,封裝了物件的建立:乙個工廠可能有很多產品,將具體化產品的操作進行了封裝,具體實現就是,factory中有乙個create函式,裡面建立不同的產品。
3) 適用於乙個類不知道它所建立物件的具體類的時候,或者希望它的子類來指定要建立的物件,或者類將建立物件的職責託付給子類。
具體而言factory模式適用於:
#include
"factory.h"
#include
"product.h"
#include
using namespace std;
intmain
(int argc,
char
* ar**)
**#ifndef _factory_h_
#define _factory_h_
class product;
//類物件,需要宣告
class factory
;class concretefactorya:public factory //工廠的子類,這裡比如工廠a,生產產品:汽車、輪子、等
;#endif
//~_factory_h_**
#include
"factory.h"
#include
"product.h"
#include
using namespace std;
factory:
:factory()
factory::~
factory()
concretefactorya:
:concretefactorya()
concretefactorya::~
concretefactorya()
product* concretefactorya:
:createproduct
(string productid)**
// product.h** // 產品基類介面
#ifndef product_h
#define product_h
#include
using namespace std;
class product
;#endif
// product_h**
// concrete_product.h**
#ifndef concrete_product_h
#define concrete_product_h
#include
"product.h"
//產品a
class producta: public product};
// 產品b
class productb: public product};
#endif
// concrete_product_h
上述方法還存在乙個問題,如果沒有productid,要建立乙個產品,就需要建立乙個工廠子類,可以通過模板解決。
templateclass standardfactory:public factory
templateproduct* standardfactory::createproduct()
主函式呼叫:
factory* faca = newstandardfactory();
product* p = faca->createproduct(); //產品a
乙個工廠建立多個產品,factory中加入相應的建立函式
*
*#ifndef _factory_h_
#define _factory_h_
class product;
//類物件,需要宣告
class factory
virtual producta*
makeproducta()
const
virtual productb*
makeproductb()
const..
....
....
...基類中virtual定義所有的產品
protected:
factory()
;//介面類,保護建構函式
private:};
class concretefactorya:public factory //工廠的子類,這裡比如工廠a,生產產品:汽車、輪子、等
virtual producta*
makeproducta()
const
virtual productb*
makeproductb()
const
protected:
private:};
#endif
//~_factory_h_
a) factory模式對於物件的建立給予開發人員提供了很好的實現策略,但是factory模式僅僅侷限於一類類(就是說product是一類,有乙個共同的基類,或者後面allproducts也是一類),如果我們要為不同類的類提供乙個物件建立的介面,那就要用abstractfactory了。
b) 每增加乙個產品,相應的也要增加乙個子工廠,加大了額外的開發量。(可以通過模板解決,或者引數化工廠解決)
23種設計模式 1 factory 模式
物件導向的設計原則 高內聚 低耦合 軟體重構 小步快跑 抽取的思想 抽取函式 抽取類 抽取介面 對擴充套件開放 對修改封閉 設計模式分類如下 1 建立型模式 factory模式 factory模式不僅僅是提供了建立物件的介面,而且延遲了子類的例項化。class product product pro...
設計模式之Factory
工廠模式主要是 為了建立物件而提供的介面。1.如下是乙個簡單的工廠類 在程式中,如果要例項化sample時.就使用 sample samplea factory.creator 1 就可。2.如下是更高一點的 抽象工廠模式。如果建立物件的方法變得複雜了,如上面的是建立乙個sample物件,這邊要是還...
設計模式之Factory
最近開始對設計模式產生了興趣,於是翻來 四人幫 的 設計模式 來看,發現很難懂,真不是我這小小的本科生能夠輕易理解的,算了,我還是先看看旁人的學習成果吧,拿來研究了一下,發現工程模式並不是很難 當然我只是說思想 挺容易上手的,閒話不多說,總結一下吧。模式名稱 工廠模式 別名 kit 說明 工廠模式包...