【定义】建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
【场景】一个简单的XML解析器,XML解析可以分两部分,第一部分:开始标签,结束标签,属性等,这部分对于所有的XML文件处理都是一样的,因为每个XML都由开始标签,结束标签等构成;第二部分:标签名,标签属性名,标签属性值等,这一部分会随着XML的不同,会有不同的处理,因为每个XML的标签名肯定会有差异。这样我们可以将XML 解析器对象的创建(包括分析开始标签,结束标签等)和它的表示(根据具体的标签名、属性名和属性值)分离。让XML Parser对象拥有一个Builder对象,Builder对象有一系列接口,包括对属性名,属性值的解析。这样当处理不同的XML时,更换Parser对象的Builder对象即可。
【UML】
【代码】以下代码极不严谨,望谅解
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Product
{
private:
vector<string> vec;
public:
void addCompose(string str)
{
vec.push_back(str);
}
void show()
{
cout<<"Product: ";
vector<string>::iterator iter = vec.begin();
for( ; iter != vec.end(); ++iter)
{
cout<<*iter<<" ";
}
cout<<endl;
}
};
class Builder
{
protected:
Product product;
public:
virtual void builderPartA(){}
virtual void builderPartB(){}
virtual Product getResult()
{
return product;
}
};
class BuilderConcreteOne : public Builder
{
public:
virtual void builderPartA()
{
product.addCompose("OneA");
}
virtual void builderPartB()
{
product.addCompose("OneB");
}
virtual Product getResult()
{
return product;
}
};
class BuilderConcreteTwo : public Builder
{
public:
virtual void builderPartA()
{
product.addCompose("TwoA");
}
virtual void builderPartB()
{
product.addCompose("TwoB");
}
virtual Product getResult()
{
return product;
}
};
class Director
{
private:
Builder* builder;
public:
void construct(Builder* b)
{
builder = b;
builder->builderPartA();
builder->builderPartB();
}
};
int main()
{
Director d;
Builder* one = new BuilderConcreteOne;
d.construct(one);
Product p = one->getResult();
p.show();
delete one;
return 0;
}