標籤: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章