設計模式學習筆記(C++)---原廠模式

來源:互聯網
上載者:User

標籤:相互   ++   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++)---原廠模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.