标签:text rod rgb 引用 private net using pre --
说明:本文仅供学习交流,转载请标明出处。欢迎转载!
建造者模式(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设计模式》
标签:text rod rgb 引用 private net using pre --
原文地址:http://www.cnblogs.com/ljbguanli/p/7168260.html