1. 意图
将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示。并且因为构建过程是标准化的,所以当需要标准化构建过程时也可以使用。
2. 结构与参与者
3. 效果
1) 它使你可以改变一个产品的内部表示
Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。
2) 它将构造代码和表示代码分开
Builder模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息。只要调用指挥者的接口就可以了。每一个ConcreteBuilder包含了创建和装配一个特定产品的所有代码。然后不同的Director可以复用它以在相同部件集合的基础上构造不同的产品(改变顺序)。
3) 对各过程进行更精细的控制
Builder模式与一下子就生成产品的创建型模式不同,它是在指挥者的控制下一步一步构造产品的。仅在该产品完成时指挥者才从生成器中取回它。因此Builder接口相比其他创建型模式能更好地反应产品的构造过程。同时通过创建不同的指挥者,可以使得产品按不同的步骤进行生产。这可以说明Builder模式处理生产线产品,抽象工厂模式处理分系列产品。
4. 实现
1) 装配和构造函数
生成器逐步的构造它们的产品。因此Builder类接口必须足够普遍,以便为各种类型的具体生成器构造产品。
2) 产品没有抽象类
通常情况下,有具体生成器生成的产品,它们的表示区别是如此之大以至于给不同的产品以公共父类没有太大意思。
3) 在Builder类中缺省的方法为空
C++中,生成方法故意不声明为纯虚成员函数,而是将它们定义为空方法,这样没有强制修改所有的生成方法,只选用足够的步骤进行修改就可以了。(想想纯虚函数与虚函数的区别)。
5. 代码示例
一个按步骤创建摩托车、普通汽车、加强型汽车的例子:
#include <iostream>
#include <vector>
#include <string>
#pragma warning (disable: 4786) //忽略警告C4786
using namespace std;
//Product类
class Vehicle
{
private:
vector<string> m_vpart;
public:
void AddPart(string str)
{
m_vpart.push_back(str);
}
void Show()
{
cout << "Vehicle parts:" << endl;
for (vector<string>::iterator iter=m_vpart.begin();iter!=m_vpart.end();iter++)
{
cout << *iter <<endl;
}
}
};
//抽象Builder类
class VehicleBuilder
{
public:
virtual BuildPartA(){}
virtual BuildPartB(){}
virtual BuildPartC(){}
virtual Vehicle* GetResult(){return 0;}
};
//具体Builder类
class MotorCycleBuilder:public VehicleBuilder
{
private:
Vehicle* m_product;
public:
MotorCycleBuilder()
{
m_product=new Vehicle;
}
virtual BuildPartA()
{
m_product->AddPart("MotorPartA");
}
virtual BuildPartB()
{
m_product->AddPart("MotorPartB");
}
virtual Vehicle* GetResult()
{
return m_product;
}
};
//具体Builder类
class CarBuilder:public VehicleBuilder
{
private:
Vehicle* m_product;
public:
CarBuilder()
{
m_product=new Vehicle;
}
virtual BuildPartA()
{
m_product->AddPart("CarPartA");
}
virtual BuildPartB()
{
m_product->AddPart("CarPartB");
}
virtual BuildPartC()
{
m_product->AddPart("CarPartC");
}
virtual Vehicle* GetResult()
{
return m_product;
}
};
//指挥者类,运用具体构造器的接口来标准化生成对象
class Director
{
public:
void Construct(VehicleBuilder* builder)
{
builder->BuildPartA();
builder->BuildPartB();
}
};
//可以定义不同的指挥者类,这样的化可以选择
//组装不同的够造步骤,生成不同的产品
class DirectorPlus
{
public:
void Construct(VehicleBuilder* builder)
{
builder->BuildPartA();
builder->BuildPartB();
builder->BuildPartC();
}
};
//客户端
int main()
{
CarBuilder* carBuiler=new CarBuilder;
CarBuilder* carBuilerPlus=new CarBuilder;
MotorCycleBuilder* motorBuilder=new MotorCycleBuilder;
Director* dp=new Director;
DirectorPlus* dpp=new DirectorPlus;
dp->Construct(carBuiler); //构建普通汽车
Vehicle* car=carBuiler->GetResult();
dp->Construct(motorBuilder); //构建摩托车
Vehicle* motor=motorBuilder->GetResult();
cout << "We build a ordinary car"<<endl;
car->Show();
cout << "We build a motorcycle"<<endl;
motor->Show();
dpp->Construct(carBuilerPlus); //构建加强版的汽车
Vehicle* carp=carBuilerPlus->GetResult();
cout << "We build a enhanced car"<<endl;
carp->Show();
cout << "Program created by sicofield"<<endl;
return 0;
}