1.简介
建造者模式主要是用于创建一些复杂的对象,这些对象内部构建简的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
用途:使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如果需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
2.实例
#include <iostream>
#include <vector>
#include <string>
using namespace std;
//产品类
class Product
{
public:
void add(const string &part)
{
parts.push_back(part);
}
void print() const
{
for (const string &i : parts)
{
cout << i << endl;
}
}
private:
vector<string> parts;
};
//建造者基类
class Builder
{
public:
//为多态基类声明一个虚析构函数
virtual ~Builder()
{
}
//创建部件A
virtual void buildPartA() = 0;
//创建部件B
virtual void buildPartB() = 0;
//获取创建后的产品
virtual Product getResult() const = 0;
protected:
Product product;
};
//具体建造类1
class ConcreteBuilder1 : public Builder
{
public:
virtual void buildPartA() override
{
product.add("Part A1");
}
virtual void buildPartB() override
{
product.add("Part B1");
}
virtual Product getResult() const override
{
return product;
}
};
//具体建造类2
class ConcreteBuilder2 : public Builder
{
public:
virtual void buildPartA() override
{
product.add("Part A2");
}
virtual void buildPartB() override
{
product.add("Part B2");
}
virtual Product getResult() const override
{
return product;
}
};
//指挥者类
class Director
{
public:
//指挥建造过程
Product construct(Builder &builder) const
{
builder.buildPartA();
builder.buildPartB();
return builder.getResult();
}
};
int main()
{
Director director;
Builder *b1 = new ConcreteBuilder1();
Builder *b2 = new ConcreteBuilder2();
Product p1=director.construct(*b1);
Product p2=director.construct(*b2);
p1.print();
p2.print();
delete b1;
delete b2;
return 0;
}