1、意图
将一个复杂对象的创建与它的表示分享,使得同样的构建过程可以创建不同的表示。
2、适用性
(1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
(2)当构造过程必须允许被构造对象有不同的表示时
3、参与者
Builder:为创建一个Product对象的各个部件指定抽象接口
ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件;定义并明确它所创建的表示;提供一个检索产品的接口
Director:构造一个使用Builder接口的对象
Product:表示被构造的复杂对象;包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
UML类图表示为
4、协作
(1)客户创建Director对象,并用它所想要的Builder进行配置
(2)一旦产品部件被生成,导向器就会通知生成器
(3)生成器处理导向器的请求,将将部件添加到产品中
(4)客户从生成器中检索产品
UML序列图表示为
5、效果
(1)它使你可以改变一个产品的内部表示
(2)它将构造代码和表示代码分开
(3)它使你对构造过程进行更精细的控制
6、相关模式
AbstractFactory与Builder相似,因为它也可以创建复杂对象。主要的区别是Builder模式着重于一步步构造一个复杂对象。而AbstractFactory着重于多个系列的产品对象。
c++的例子代码如下
#include <iostream>
#include <string>
using namespace std;
class Product
{
string parts;
public:
Product(){}
~Product(){}
void addPart(string part) { parts += part + " ";}
string getPart() {return parts; }
};
class Builder
{
public:
virtual void buildPart1() = 0;
virtual void buildPart2() = 0;
};
class ConcreteBuilder1 : public Builder
{
Product product;
public:
void buildPart1()
{
product.addPart("Builder1");
}
void buildPart2()
{
product.addPart("pattern");
}
Product& getProduct() {return product;}
};
class ConcreteBuilder2 : public Builder
{
Product product;
public:
void buildPart1()
{
product.addPart("Builder2");
}
void buildPart2()
{
product.addPart("pattern");
}
Product& getProduct() {return product;}
};
class Director
{
Builder &builder;
public:
Director(Builder &build):builder(build){}
void construct()
{
builder.buildPart1();
builder.buildPart2();
}
};
int main()
{
ConcreteBuilder1 builder1;
ConcreteBuilder2 builder2;
Director director1(builder1);
director1.construct();
Director director2(builder2);
director2.construct();
Product& product1 = builder1.getProduct();
cout << product1.getPart() << endl;
Product& product2 = builder2.getProduct();
cout << product2.getPart() << endl;
return 0;
}