C 設計模式 工廠方法

2021-06-19 08:25:22 字數 2946 閱讀 3408

定義

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