创建型模式之建造者模式(Builder)
建造者模式(Builder)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder:抽象的创造者,为创建一个产品对象的各个部件指定抽象的接口;
ConcreteBuilder:具体建造者,实现抽象Builder定义的接口来完成产品的各个部件的创建。
Director:指挥者,它是一个使用Builder接口的对象;
Product:具体的产品对象。
代码框架
#include <iostream>
#include <string>
using namespace std;
class Product
{
public:
Product() {};
~Product() {};
void setPartAColor(string str)
{
ProductPartA = str;
}
void setPartBColor(string str)
{
ProductPartB = str;
}
void setPartCColor(string str)
{
ProductPartC = str;
}
public:
string ProductPartA;
string ProductPartB;
string ProductPartC;
};
class Builder
{
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual void BuildPartC() = 0;
virtual const Product& GetProduct() = 0;
};
class ConcreteBuilder :public Builder
{
public:
void BuildPartA()
{
_pro.setPartAColor("red");
}
void BuildPartB()
{
_pro.setPartBColor("green");
}
void BuildPartC()
{
_pro.setPartCColor("black");
}
const Product& GetProduct()
{
cout << _pro.ProductPartA << " " <<_pro.ProductPartB << " " << _pro.ProductPartC << endl;
return _pro;
}
private:
Product _pro;
};
class Director
{
public:
Director(Builder* bld)
{
_bld = bld;
}
~Director() {}
void Construct()
{
_bld->BuildPartA();
_bld->BuildPartB();
_bld->BuildPartC();
_bld->GetProduct();
}
private:
Builder* _bld;
};
int main()
{
ConcreteBuilder* builder = new ConcreteBuilder();
Director* director = new Director(builder);
director->Construct();
}
通过上面的代码框架可以看出:Builder是对product构造部件分离(我们把产品的部件A,B,C构造想象成是一个很复杂的过程),Builder做的事情仅仅是对构造Product进行了封装,通过接口来构造不同的part,Director是整个设计模式的核心,它是真正的Product创造者,上述我们通过Construct封装了构造的过程,并且隐藏了组装的细节(对用户来说);所以如果想要改变一个产品的内部表示,只需要提供一个Builder就可以了。
Builder与AbstractFactory的区别
builder模式和AbstractFactory模式功能很相似,都是用来创建大的复杂的对象,他们的区别:
Builder模式强调的对构造过程的封装,多了一个Director来控制Product的创建,并隐藏其中的组装细节;AbstractFactory只是提供创建多个相互依赖对象的接口