1. 建造者模式的由来
在构建一个复杂对象的时候,经常会有这种情况:该对象是由各个部分的子对象按照一定的步骤或者算法构成。这些子对象也许会经常变化,但它们组合的方式却不变。
以建造小人为例,尽管建造出的小人各不相同,有大有小,有高有低,但都是按照一个流程进行的。头-》身体-》左右手-》左右脚。建造者模式与此类似,在向导的指导下一步一步完成产品的建造。
2. 类图表示
3. 实现示例代码
//建造者模式
#include <iostream>
#include <string>
using namespace std;
//产品类
class Product
{
private:
string partA; //产品的组件A
string partB; //组件B
public:
Product(){}
//添加组件A
void addPartA(string pa)
{
this->partA=pa;
}
//添加组件B
void addPartB(string pb)
{
this->partB=pb;
}
//显示产品
void show()
{
cout<<"PartA:"<<partA<<endl;
cout<<"PartB: "<<partB<<endl;
}
};
//Builder接口
class Builder
{
public:
virtual void buildPartA()=0;//组装A组件
virtual void buildPartB()=0;//组装B组件
virtual Product* getProduct()=0;//返回产品
};
//产品1的Builder,实现Builder接口
class Builder1:public Builder
{
private:
//包含一个产品对象(数据成员)
Product *pro;
public:
Builder1()
{
pro=new Product;
}
void buildPartA()
{
pro->addPartA("产品1的A组件");
}
void buildPartB()
{
pro->addPartB("产品1的B组件");
}
Product* getProduct()
{
return pro;
}
};
//产品2的Builder,实现Builder接口
class Builder2:public Builder
{
private:
//包含一个产品对象(数据成员)
Product *pro;
public:
Builder2()
{
pro=new Product;
}
void buildPartA()
{
pro->addPartA("产品2的A组件");
}
void buildPartB()
{
pro->addPartB("产品2的B组件");
}
Product* getProduct()
{
return pro;
}
};
//指挥者,负责指挥产品的组建
class Director
{
public:
void construct(Builder* bu)
{
bu->buildPartA();
bu->buildPartB();
}
};
int main()
{
//创建一个指挥者
Director dir;
Builder1* bu1=new Builder1;
dir.construct(bu1);
Product* pro1=bu1->getProduct();
pro1->show();
return 0;
}