这段代码实现了建造者模式(Builder Pattern),它用于分步骤构建一个复杂的对象。
个人理解,欢迎大家指正。
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
// 产品类,表示建造者模式中的最终产品
class product
{
public:
vector<string> parts;// 产品由一系列部件组成,这里使用字符串向量存储部件名称
void ListParts()const // 列出产品所有部件的方法
{
for(int i = 0;i < parts.size(); i++) // 遍历部件列表
cout << parts[i] << ""; // 打印每个部件名称
cout << endl;
}
};
// 建造者基类,定义了基本方法
class Builder
{
public:
virtual ~Builder(){}
virtual void BuildPartA() const = 0; // 纯虚函数,构建产品部件A的步骤
virtual void BuildPartB() const = 0; // 纯虚函数,构建产品部件B的步骤
};
// 具体建造者类,实现了Builder接口,构建一个具体产品
class ConcreteBuilder1 : public Builder
{
private:
shared_ptr<product> pro_ptr;// 使用智能指针存储产品对象,避免内存泄漏
public:
ConcreteBuilder1() // 构造函数,初始化产品对象
{
pro_ptr = make_shared<product>();
}
~ConcreteBuilder1() // 析构函数,释放产品对象
{
pro_ptr.reset();
}
void BuildPartA() const override // 实现构建部件A的步骤
{
pro_ptr->parts.push_back("PartA "); // 向产品中添加部件A
}
void BuildPartB() const override
{
pro_ptr->parts.push_back("PartB"); // 向产品中添加部件B
}
shared_ptr<product> GetProduct()const // 获取构建好的产品对象
{
return pro_ptr;
}
};
// 指挥者类,负责安排建造者构建产品的顺序
class Director
{
private:
shared_ptr<Builder> builder_ptr; // 使用智能指针存储建造者对象
public:
void set_builder(shared_ptr<Builder> builder_ptr) // 设置建造者对象的方法
{
this->builder_ptr = builder_ptr;
}
// 构建产品的方法
void Construct()
{
builder_ptr->BuildPartA();// 指挥建造者构建部件A
builder_ptr->BuildPartB();// 指挥建造者构建部件B
}
};
int main()
{
// 创建指挥者对象的智能指针
shared_ptr<Director> director_ptr = make_shared<Director>();
// 创建具体建造者对象的智能指针
shared_ptr<ConcreteBuilder1>builder_ptr = make_shared<ConcreteBuilder1>();
// 设置指挥者使用的建造者
director_ptr->set_builder(builder_ptr);
// 指挥者开始构建产品
director_ptr->Construct();
// 获取产品并列出所有部件
builder_ptr->GetProduct()->ListParts();
return 0;
}
这段代码中,product 类是一个简单的产品,它包含了一系列部件。Builder 是一个抽象类,定义了构建产品的方法。ConcreteBuilder1 是 Builder 的一个具体实现,它构建了一个包含部件A和部件B的产品。Director 类负责控制构建过程,它接受一个 Builder 对象,并调用其方法来构建产品。
在 main 函数中,我们创建了一个 Director 对象和一个 ConcreteBuilder1 对象,然后通过 Director 对象来构建产品。最后,我们通过 ConcreteBuilder1 对象获取构建好的产品,并打印出其所有部件。