Bootstrap

C++设计模式之建造者模式

这段代码实现了建造者模式(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 对象获取构建好的产品,并打印出其所有部件。

;