建造者模式(Builder):将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。
下面是建造者模式的UML图:
下面是C++实现的代码:
/*
* initm.com
* 作者:Stupid
* 时间:2017-10-25 21:36
* 描述: 代码使用QT5.9+MinGW53_32编译通过,代码为建造者模式的基本结构代码。
*/
#include <QCoreApplication>
#include <iostream>
#include <list>
template <typename T>
class Product
{
private:
std::list<T> list;
public:
void Add(T data){
list.push_back(data);
}
void Show(){
for(auto index: list){
std::cout << index << std::endl;
}
}
};
class Builder
{
protected:
Product<const char*>* product;
public:
Builder(){
product = new Product<const char*>;
}
virtual void BuildPartA()=0;
virtual void BuildPartB()=0;
virtual Product<const char*>* GetResult()=0;
virtual ~Builder(){
if(product){
delete product;
}
}
};
class ConcreteBuilder1: public Builder
{
public:
void BuildPartA()override final{
product->Add("PartA");
}
void BuildPartB()override final{
product->Add("PartB");
}
Product<const char*>* GetResult()override final{
return product;
}
};
class ConcreteBuilder2: public Builder
{
public:
void BuildPartA()override final{
product->Add("PartX");
}
void BuildPartB()override final{
product->Add("PartY");
}
Product<const char*>* GetResult()override final{
return product;
}
};
class Director
{
public:
void Construct(Builder* builder){
builder->BuildPartA();
builder->BuildPartB();
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Director* director = new Director;
Builder* builder1 = new ConcreteBuilder1;
director->Construct(builder1);
builder1->GetResult()->Show();
std::cout << "---------------------------------" << std::endl;
Builder* builder2 = new ConcreteBuilder2;
director->Construct(builder2);
builder2->GetResult()->Show();
return a.exec();
}
建造者模式的优点在于建造者隐藏了建造过程,如果想构建新的建造过程,那么只需要增加一个新的建造类就可以了。