工廠模式一般分為三種:
其中簡單工廠與工廠方法在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...