
比如我们要通过一个汽车加工厂,生产一辆汽车;汽车由车轮 方向盘 发动机还有各种小零件等等组成,它的基本组装步骤是:
- 生产车轮
- 生产方向盘
- 生产发动机
.................
通过上面的分析,我们知道,该范例满足Builder模式的应用场景所提到的条件:
- 对象的创建:我们需要创建汽车对象
- 创建的是一个复合对象:我们需要创建的汽车对象是具有车轮 方向盘 发动等复合属性的复合对象
下面我们用Builder设计模式来抽象以上组装过程:
- Client:买汽车的顾客。通过向Director申请,然后Director让Builder组装汽车
- Director:负责生产汽车的经理,或者销售人员
- Builder:汽车组装抽象类
- ConcreteBuilder:生产汽车的直接员工
Builder接口:
用Director构建最后的复杂对象,而在上面Builder接口中封装的是如何创建一个个部件(复杂对象是由这些部件组成的),也就是说Director的内容是如何将部件最后组装成成品,即在director中就负责把零件拼装成成品,director封装了汽车生产的细节。
Builder的具体实现ConcreteBuilder:
通过具体完成接口Builder来构建或装配产品的部件;
定义并明确它所要创建的是什么具体东西;
提供一个可以重新获取产品的接口:
复杂对象:产品Product:
客户端调用:director负责发布命令,builder才负责真正的生产,所以向builder要产品而不是director
C++代码大致如下:
// 复杂对象部件接口
class CCarPart { };
// 这里有一个复杂对象类Product。它的构建需要PartA,PartB,PartC。
class CProduct
{
public:
CProduct(CCarPart* pCarPartA, CCarPart* pCarPartB, CCarPart* pCarPartC) { }
~CProduct() { }
};
// 复杂对象的构建接口,产品生成器。
class CCarBuilder
{
public:
virtual ~CCarBuilder() { }
//创建部件A 比如创建汽车车轮
virtual void BuildPartA() = 0;
//创建部件B 比如创建汽车方向盘
virtual void BuildPartB() = 0;
//创建部件C 比如创建汽车发动机
virtual void BuildPartC() = 0;
//返回最后组装成品结果 (返回最后装配好的汽车)
//成品的组装过程不在这里进行,而是转移到下面的Director类中进行.
//从而实现了解耦过程和部件
virtual CProduct* GetProduct() = 0;
};
// 奥迪汽车,具体的产品生成器对象。
class CAudiBuilder : public CCarBuilder
{
public:
CAudiBuilder() { }
~CAudiBuilder() { }
public:
virtual void BuildPartA() { printf("[CAudiBuilder] 创建奥迪汽车车轮 \n"); /*m_pPartA =*/ }
virtual void BuildPartB() { printf("[CAudiBuilder] 创建奥迪汽车方向盘 \n"); /*m_pPartB =*/ }
virtual void BuildPartC() { printf("[CAudiBuilder] 创建奥迪汽车发动机 \n"); /*m_pPartC =*/ }
virtual CProduct* GetProduct()
{
printf("[CAudiBuilder] 组建奥迪汽车 \n");
return new CProduct(m_pPartA, m_pPartB, m_pPartC);
}
private:
CCarPart* m_pPartA;
CCarPart* m_pPartB;
CCarPart* m_pPartC;
};
// 产品组装工厂
class CCarConstructFactory
{
public:
CCarConstructFactory(CCarBuilder* pBuilder) : m_pBuilder(pBuilder) { }
~CCarConstructFactory() { delete m_pBuilder; m_pBuilder = NULL; }
// 在这里实现部件的组装及汽车的组装。
void Construct()
{
m_pBuilder->BuildPartA();
m_pBuilder->BuildPartB();
m_pBuilder->BuildPartC();
}
private:
CCarBuilder* m_pBuilder;
};
C++ Demo测试代码
void BuilderDemo()
{
// 建立产品生成器对象
CCarBuilder* pBuilder = new CAudiBuilder();
// 建立产品组装工厂,由工厂操作产品生成器进行组装
CCarConstructFactory* pFactory = new CCarConstructFactory(pBuilder);
// 开始组装。这里,改变工厂的组装过程,就可以组装成不同的产品。
pFactory->Construct();
// 组装完毕
// 从产品生成器中得到产品
CProduct* pProduct = pBuilder->GetProduct();
// 释放资源
delete pProduct;
delete pFactory;
}
五、总结
总之,Builder模式就是把复杂对象的创建和部件的创建分别开来,对象的创建用Director类来表示,而部件的创建用Builder类来表示.
适用性:
1、需要生成的产品对象有复杂的内部结构。
2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、当复杂对象的创建应该独立于该对象的组成部分和装配方式时