说明:本文仅供学习交流,转载请标明出处,欢迎转载!
建造者模式(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设计模式》