工廠 Factory 模式

2021-09-14 04:42:27 字數 2831 閱讀 5054

工廠模式一般分為三種:

其中簡單工廠與工廠方法在gof中統稱為工廠模式。由於所有建立型模式都的基本要求就是為物件的建立提供介面,封裝物件的生成。所以簡單工廠不專門作為一種建立型模式。但是簡單工廠作為建立型模式的基本要求,雖然簡單,也值得我們學習一番。

上面提到,簡單工廠提供了建立型模式的基本功能,完成對物件建立的封裝。其使用場景主要在當product的種類太多導致型別名混亂時,使用對factory傳入引數的不同來區分不同種類的product。注意:以上所說的種類是指所有product類均派生自同一基類,否則無法用引數將其區別開來。(引數就是它們屬於同一基類的體現)

舉個栗子:某車廠現生產多種品牌的車bwm 和 nio等. 我們將其基本的功能屬性抽象出父類car,通過乙個函式createcar的傳入引數不同,確認生成的是那個子類的具體例項,返回基類指標. 這樣我們就可以將物件的生成引數化,控制相同基類的子類物件的生成.

#include

#ifndef _design_pattern_******_factory_car_hpp_

#define _design_pattern_******_factory_car_hpp_

namespace design_pattern

;class

bmw:

public car};

class

nio:

public car};

}#endif

//_design_pattern_******_factory_car_hpp_

//factory_car.hpp

#include

"car.hpp"

#include

#ifndef _design_pattern_******_factory_factorycar_hpp_

#define _design_pattern_******_factory_factorycar_hpp_

namespace design_pattern};

}#endif

//_design_pattern_******_factory_factorycar_hpp_

//******_factory_main.cpp

#include

"car.hpp"

#include

"factory_car.hpp"

using

namespace design_pattern;

intmain()

顯然,bmw與nio都是由car派生而來,在createcar函式中,由於其都對string name引數感興趣才在建立時區分出了bmw與nio。這就造成,當類進行擴充套件時,就要去修改createcar函式。也就是,若共工廠產品出現變化,nio停產或者加入新的型別的車,這時我們需要將之前的createcar方法修改,造成對原有**的入侵.不符合開放封閉原則由於產品體系過於龐大,產品體系出現分層現象。我們之前的簡單工廠只能在同一層內區別產品的不同。當產品出現產品樹時,我們的工廠模式也進一步以樹形進行分層抽象完成在葉子節點的建立,在中間節點的使用的功能。工廠方法模式也就此形成。

注意:雖然工廠方法模式完成了產品的分層抽象及建立,但其依然侷限於同類產品,所有產品必須擁有乙個共同的基類。

假設,在factorycar中,我們並不知道它們可以通過name區分開來,因為這個類太過籠統。但我們知道在factorycar的子類中,隨著工廠的逐步細化,在其子類factorybmw與factorynio中我們就可以知道其建立的具體物件。

與******_factory中一致

//factory_car_series.hpp

#include

"car.hpp"

#ifndef _design_pattern_factory_method_factory_car_series_hpp_

#define _design_pattern_factory_method_factory_car_series_hpp_

namespace design_pattern

;class

factorybmw

:public factorycarbase};

class

factorynio

:public factorycarbase};

}#endif

//_design_pattern_factory_method_factory_car_series_hpp_

//factory_method_main.cpp

#include

"car.hpp"

#include

"factory_car_series.hpp"

using

namespace design_pattern;

intmain()

顯然,在父類factorycarbase中,我們並不知道建立那種car,只有在其子類中我們才知道具體建立的種類。

當然,如果我們嫌factorycarbase通過繼承方式太過浪費,那也可以採用之前的引數化工廠方法實現。

語法tips

factory工廠模式

1.factory模式 兩個重要的功能 1 定義建立物件的介面,封裝了物件的建立 2 使得具體化類的工作延遲到了子類中。factory模式僅僅侷限於一類類 就是說product是一類,有乙個共同的基類 如果我們要為不同類的類提供 乙個物件建立的介面,那就要用abstractfactory了。我們經常...

工廠模式Factory

工廠方法模式完全符合設計模式原則,降低了物件之間的耦合度,而且,工廠方法模式依賴於抽象的架構,將例項化的任務交由了子類實現.比如你想要出門,每次出行你都要根據天氣情況選擇出行方式,如果下雨天,就開自己的私家車,如果晴天就出門坐公車。那麼這裡可以抽取出乙個基類出來。車的基類 public abstra...

Factory 工廠模式

工廠模式有3種。以下的示例 都省略了建構函式與析構函式。一 簡單工廠模式 簡單工廠模式就是只有乙個工廠,所有的產品都有該工廠生產。每一種產品都有乙個對應的type。當需要某種產品時,將該產品的type傳給工廠,然後工廠即會返回該產品。這樣意味著工廠內部必須針對type作判斷,也就是使用乙個switc...