標籤:相互 ++ public 方法 缺點 筆記 eth nbsp --
原廠模式:簡單原廠模式、Factory 方法模式、抽象原廠模式
1)、簡單原廠模式:主要特點是需要在工廠類中做判斷,從而創造相應的產品,當增加新產品時,需要修改工廠類。
typedef enum{ T80 = 1, T99}TankType;class Tank{public: virtual void message() = 0;};class Tank80:public Tank{public: void message() { cout << "Tank80" << endl; }};class Tank99:public Tank{public: void message() { cout << "Tank99" << endl; }};class TankFactory{public: Tank* createTank(TankType type) { switch(type) { case 1: return new Tank80(); case 2: return new Tank99(); default: return NULL; } }};
2)、Factory 方法模式:是指定義一個建立對象的介面,讓子類決定執行個體化哪一個類,Factory Method使一個類的執行個體化延遲到其子類。
意圖:定義一個建立對象的介面,讓其子類自己決定執行個體化哪一個工廠類,原廠模式使其建立過程延遲到子類進行。
主要解決:主要解決介面選擇的問題。
何時使用:我們明確地計劃不同條件下建立不同執行個體時。
如何解決:讓其子類實現工廠介面,返回的也是一個抽象的產品。
關鍵代碼:建立過程在其子類執行。
缺點:每增加一種產品,就需要增加一個對象工廠。相比簡單原廠模式,Factory 方法模式需要定義更多的類。
class Tank{public: virtual void message() = 0;};class Tank80:public Tank{public: void message() { cout << "Tank80" << endl; }};class Tank99:public Tank{public: void message() { cout << "Tank99" << endl; }};class TankFactory{public: virtual Tank* createTank() = 0;};class Tank80Factory:public TankFactory{public: Tank* createTank() { return new Tank80(); }};class Tank99Factory:public TankFactory{public: Tank* createTank() { return new Tank99(); }};
3)、抽象原廠模式:提供一個建立一系列相關或相互依賴的對象介面,而無需指定它們的具體類。
意圖:提供一個建立一系列相關或相互依賴對象的介面,而無需指定它們具體的類。
主要解決:主要解決介面選擇的問題。
何時使用:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。
如何解決:在一個產品族裡面,定義多個產品。
關鍵代碼:在一個工廠裡彙總多個同類產品。
缺點:產品族擴充非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 裡加代碼,又要在具體的裡面加代碼。
class Tank{public: virtual void message() = 0;};class Tank80:public Tank{public: void message() { cout << "Tank80" << endl; }};class Tank99:public Tank{public: void message() { cout << "Tank99" << endl; }};class Plain{public: virtual void message() = 0;};class Plain80: public Plain{public: void message() { cout << "Plain80" << endl; }};class Plain99: public Plain{public: void message() { cout << "Plain99" << endl; }};class Factory{public: virtual Tank* createTank() = 0; virtual Plain* createPlain() = 0;};class Factory80:public Factory{public: Tank* createTank() { return new Tank80(); } Plain* createPlain() { return new Plain80(); }};class Factory99:public Factory{public: Tank* createTank() { return new Tank99(); } Plain* createPlain() { return new Plain99(); }};
註:以上為本人學習筆記,如有錯誤歡迎指出,謝謝。
設計模式學習筆記(C++)---原廠模式