继续设计模式,今天是建造者模式。
建造者模式(《大话设计模式》):
将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的表示如果我们使用了建造者模式,那么用户就只需制定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化建造者模式的好处:使得建造代码与表示代码分离,由于建造者隐蔽了该产品是如何组装的, 所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了
简单示例:
#include <iostream>
#include <string>
using namespace std;
#include <vector>
//product产品类
class Product
{
private:
vector<string> parts;
public:
void Add(string part)//添加新的产品部件
{
parts.push_back(part);
}
void show()
{
cout << "产品创建完成:" << endl;
for (auto item : parts)
{
cout << "部件:" << item << endl;
}
}
};
//build类,抽象的建造者,确定产品的组成
class Builder
{
public:
Builder() {}
virtual ~Builder() {}
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual Product& GetResult() = 0;
};
//具体建造类
class ConcreteBuilder1 :public Builder
{
private:
Product product;
public:
ConcreteBuilder1() {}
~ConcreteBuilder1() {}
// 通过 Builder 继承
virtual void BuildPartA() override
{
product.Add("部件A");
}
virtual void BuildPartB() override
{
product.Add("部件B");
}
virtual Product& GetResult() override
{
// TODO: 在此处插入 return 语句
return product;
}
};
class ConcreteBuilder2 :public Builder
{
private:
Product product;
public:
ConcreteBuilder2() {}
~ConcreteBuilder2() {}
// 通过 Builder 继承
virtual void BuildPartA() override
{
product.Add("部件X");
}
virtual void BuildPartB() override
{
product.Add("部件Y");
}
virtual Product& GetResult() override
{
// TODO: 在此处插入 return 语句
return product;
}
};
class Director
{
public:
Director() {}
~Director() {}
void Construct(Builder* builder)//指挥建造过程
{
builder->BuildPartA();
builder->BuildPartB();
}
};
int main()
{
Director director;//创建指挥者
Builder* a = new ConcreteBuilder1();//创建实际建造者
Builder* b = new ConcreteBuilder2();
director.Construct(a);//指挥者指挥建造产品
a->GetResult().show();
director.Construct(b);
b->GetResult().show();
delete a;
delete b;
system("pause");
return 0;
}