【設計模式】建造者模式

來源:互聯網
上載者:User

標籤:style   blog   http   使用   os   io   2014   re   

建造者模式:將複雜物件的建造過程抽象出來,使這個抽象過程的不同實現方法可以構造出不同屬性的對象。當構造一個對象時,構造的流程是相同的,但每一個步驟對應的具體操作是有差異的。這時,可以將需要進行的初始化作為虛函數固定到一個抽象基類中,這個抽象基類稱為抽象建造者類;而具體的實現則由衍生類別中重寫的虛函數定義,這個衍生類別稱為具體建造者類。有了具體的建造步驟,下一步就是要按順序調用這些步驟,這是由一個稱為指揮者類來管理的。下面用一個C++程式類比建造者模式。

#include <iostream>#include <string>  using namespace std; // Product類class PC {public:    // 列印配置    void Display()    {        cout << "CPU : " << cpu << endl;        cout << "Memory : " << memory << endl;        cout << "Harddisk : " << harddisk << endl;    }    // 一台PC所需的裝置    string cpu;    string memory;    string harddisk;};  // 抽象建造者類class PCBuilder {public:    virtual void BuildCPU() = 0;    virtual void BuildMemory() = 0;    virtual void BuildHardDisk() = 0;    virtual const PC& GetPC() = 0;};  // 具體建造者類:第一種組合配置class ConcreteBuilder1 : public PCBuilder {public:    void BuildCPU()    {        pc.cpu = "英特爾";    }    void BuildMemory()    {        pc.memory = "金士頓";    }    void BuildHardDisk()    {        pc.harddisk = "希捷";    }    const PC& GetPC()    {        return pc;    }private:    PC pc;  // 儲存需要被構造的實體};  // 具體建造者類:第二種組合配置class ConcreteBuilder2 : public PCBuilder {public:    void BuildCPU()    {        pc.cpu = "AMD";    }    void BuildMemory()    {        pc.memory = "威剛";    }    void BuildHardDisk()    {        pc.harddisk = "日立";    }    const PC& GetPC()    {        return pc;    }private:    PC pc;  // 儲存需要被構造的實體};  // 指揮類,負責安排某個對象的構造流程class Director {public:    void Build(PCBuilder *builder)    {        builder->BuildCPU();        builder->BuildMemory();        builder->BuildHardDisk();    }};  int main(){    Director director;    PCBuilder *builder1 = new ConcreteBuilder1();    PCBuilder *builder2 = new ConcreteBuilder2();      director.Build(builder1);    director.Build(builder2);      PC pc1 = builder1->GetPC();    pc1.Display();      cout << endl;      PC pc2 = builder2->GetPC();    pc2.Display();      system("pause");    return 0;}

運行結果:


組裝一台PC的所有步驟都包含在抽象基類PCBuilder中,它只包含一些介面,具體的實現在衍生類別中定義。ConcreteBuilder1和ConcreteBuilder2分別代表了兩種配置,所以它們對虛函數的重寫內容都不相同。這裡需要注意,具體建造者類中包含了需要被構造出來的對象,這個對象被稱為Product。有了不同的配置,接下來就需要定義一個指揮者類對PC的組裝過程進行安排。在這個例子中,指揮者類是Director。當使用者代碼使用指揮者類對準備好的配置進行組裝時,會嚴格按照Director對象中的步驟進行組裝,組裝的細節對使用者是透明的。建造者模式主要用於建立一些複雜的對象,這些對象的構造順序通常是穩定的,但內部的表示卻各不相同。將複雜的構造操作封裝在類中,使得使用者在執行個體化一個對象時,不會因為遺漏某些步驟而導致建造不完整的情況。

參考:

《大話設計模式》第13章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.