建造者模式之C++實現
阿新 • • 發佈:2017-07-14
emp 產品 它的 聚合 begin tor typename 默認 學習交流
說明:本文僅供學習交流,轉載請標明出處。歡迎轉載!
建造者模式(Builder)也叫生成器模式,我們都知道。假設我們想完畢一個復雜產品的創建過程,我們必須分開創建。再組裝。
比方說自行車,有鐵架、車鈴、車座、輪胎、鋼圈。
假設我們須要組裝一個自行車,必須有這些東西,從創建者模式的角度分析。我們把自行車視為“產品”。把鐵架、車鈴、車座...等視為“部件”。而不同的部件的價格和性能也表現不一樣。所以我們再組裝前必須依據實際情況來選擇對應的部件,這個過程我們能夠總結為:在選擇詳細的部件之後進行組裝,得到我們預期的自行車。
通過以上分析後。給出建造者模式定義:
建造者模式 :將一個復雜對象的構建和它的表示分離,使得相同的構建過程能夠創建不同的表示。
對上面的定義中給出兩點說明:
1.對象的表示:宏觀概念,構建對象我們須要做些什麽?(做什麽)
2.對象的構建:微觀觀念。構建對象我們應該怎麽做?(怎麽做)
建造者模式的結構圖
本圖來自《大話設計模式》
C++實現代碼:
#include<iostream> #include<list> #include<string> #include<algorithm>//for_each(b,e,Fun) using namespace std; template<typename T> struct ShowFun//定義一個仿函數,供for_each函數使用 { void operator()(T t) { cout<<t<<endl; } }; class Product//詳細產品類 { private: list<string> parts; public: void Add(string part)//為產品加入部件 { parts.push_back(part); } void Show()//顯示產品的各個部件 { cout<<endl<<"產品 創建----"<<endl; for_each(parts.begin(),parts.end(),ShowFun<string>());//輸出產品 } }; class Builder//抽象建造者 { public: virtual void BuildPartA()=0;//創建部件A virtual void BuildPartB()=0;//創建部件B virtual Product GetResult()=0;//返回加入部件後得到的產品的結果 }; class ConcreteBuilder1:public Builder//詳細建造者1,註意C++默認的繼承方式為private { private: Product p;//內置產品類,聚合關系 public: void BuildPartA()//加入部件A { p.Add("部件A"); } void BuildPartB()//加入部件B { p.Add("部件B"); } Product GetResult()//返回產品對象 { return p; } }; class ConcreteBuilder2:public Builder//詳細建造者2 { private: Product p;//內置產品類。聚合關系 public: void BuildPartA()//加入部件A { p.Add("部件X"); } void BuildPartB()//加入部件B { p.Add("部件Y"); } Product GetResult()//返回產品對象 { return p; } }; class Director//管理者類個,依據用戶的需求創建小人對象 { public: void Construct(Builder& b)//用引用實現多態 { b.BuildPartA(); b.BuildPartB(); } }; int main() { Director director; /********建造者1**********/ Builder &b1=ConcreteBuilder1(); director.Construct(b1);//創建 b1.GetResult().Show();//顯示上面創建的產品 /*******創建這2*******/ Builder &b2=ConcreteBuilder2(); director.Construct(b2); b2.GetResult().Show();//顯示上面創建的產品 return 0; }
測試結果
參考資料:
[1]《大話設計模式》
[2]《設計模式之禪》
[3]《HeadFirst設計模式》
建造者模式之C++實現