C 設計模式 工廠方法

2021-05-25 10:25:55 字數 3441 閱讀 9388

定義

定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法(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

class

cconcretecreator : public coscreator

;

virtual cosproduct* create()

;

protected

:string m_strproducttype;

};

int  main()

輸出:

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結...