23種設計模式之Factory模式(一)

2021-09-29 15:55:53 字數 3219 閱讀 1488

最近寫大**實在無聊,所以決定每天閒暇時學習一種設計模式,主要參考:設計模式:可復用物件導向的軟體基礎一書、設計模式精解-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 說明 工廠模式包...