意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Product //一个被构造的复杂对象,是一个包含组件的类
{
private:
vector<string> Part;
public:
void AddPartA(string PartName)
{
Part.push_back(PartName);
}
void AddPartB(string PartName)
{
Part.push_back(PartName);
}
void Show()
{
for( vector<string>::iterator i = Part.begin();i != Part.end(); i++)
{
cout << *i << " ";
}
cout << "construct finished";
}
};
class Builder //生成器,为创建一个Product对象的各个部件指定抽象接口,与Abstrct Factory类似,也使用了工厂方法
{
public:Product product;
public:
virtual void AddPart() = 0;
virtual Product& Return() = 0;
};
class ConcretBuilder1:public Builder //创建具体产品的内部表示并定义它的装配流程
{
public:
void AddPart()
{
product.AddPartA(string("Product1PartA"));
product.AddPartB(string("Product1PartB"));
}
Product& Return()
{
return this->product;
}
};
class ConcretBuilder2:public Builder
{
public:
void AddPart()
{
product.AddPartA(string("Product2PartA"));
product.AddPartB(string("Product2PartB"));
}
Product& Return()
{
return this->product;
}
};
class Director //导向器,构造一个使用Builder接口的对象
{
public:
Product& Construct(Builder* builder)
{
builder->AddPart();
return builder->Return();
}
};
int main()
{
Director* director = new Director();
Builder* builder1 = new ConcretBuilder2();
Product product = director->Construct(builder1);
product.Show();
delete director;
delete builder1;
return 1;
}
效果:
1 使得可以改变一个产品的内部表示
2 使得构造代码和表示代码分开
3 使得可以对构造过程进行更精细的控制
相关模式:
1 Abstract Factory与Builder相似,它们都使用了工厂方法,都可以创建复杂对象,主要区别在于Builder着重于一步步构造一个复杂对象,而Abstract Factory着重于多个系列的产品对象;Builder在最后一步返回产品,而Abstract Factory的产品是立即返回的
2 Composite通常是Builder生成的