设计模式--建造者(Builder)模式

建造者模式(Builder Pattern)是一种对象构建设计模式,它提供了一种构建对象的最佳方式。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在建造者模式中,一个导演(Director)负责组织各个部分(Builder)的构建步骤,一个抽象构建器(Abstract Builder)定义了各个部分的构建和产品的组装,一个具体构建器(Concrete Builder)实现了抽象构建器所定义的各个构建操作。

下面是一个使用C++实现的简单示例:

#include <iostream>
#include <string>
#include <vector>

// 抽象构建器
class IProduct {
public:
    virtual void show() = 0;
};

// 具体构建器A
class ProductA : public IProduct {
public:
    void show() override {
        std::cout << "ProductA" << std::endl;
    }
};

// 具体构建器B
class ProductB : public IProduct {
public:
    void show() override {
        std::cout << "ProductB" << std::endl;
    }
};

// 抽象建造者
class IBuilder {
public:
    virtual void setPartA() = 0;
    virtual void setPartB() = 0;
    virtual IProduct* getProduct() = 0;
};

// 具体建造者1
class Builder1 : public IBuilder {
private:
    IProduct* product = nullptr;
public:
    void setPartA() override {
        // 实现部分A的构建操作...
        product = new ProductA(); // 创建具体产品A对象
    }
    void setPartB() override {
        // 实现部分B的构建操作...
        product = new ProductB(); // 创建具体产品B对象
    }
    IProduct* getProduct() override {
        return product; // 返回产品对象指针
    }
};

// 具体建造者2
class Builder2 : public IBuilder {
private:
    IProduct* product = nullptr;
public:
    void setPartA() override {
        // 实现部分A的构建操作...
        product = new ProductB(); // 创建具体产品B对象
    }
    void setPartB() override {
        // 实现部分B的构建操作...
        product = new ProductA(); // 创建具体产品A对象
    }
    IProduct* getProduct() override {
        return product; // 返回产品对象指针
    }
};

// 导演类,负责组织各个部分的构建步骤,并返回最终产品对象指针。
class Director {
private:
    IBuilder* builder = nullptr; // 指向当前正在构建的对象的具体建造者对象指针。
public:
    void setBuilder(IBuilder* b) { builder = b; } // 设置当前正在构建的对象的具体建造者对象指针。
    void buildPartA() { builder->setPartA(); } // 执行部分A的构建操作。
    void buildPartB() { builder->setPartB(); } // 执行部分B的构建操作。
    IProduct* getProduct() { return builder->getProduct(); } // 返回最终的产品对象指针。如果当前建造者对象还没有被组装完成,则先调用其组装方法组装完成后再返回产品对象指针。如果当前建造者对象已经被组装完成,则直接返回其产品对象指针。如果当前建造者对象为空,则先调用其组装方法组装完成后再返回产品对象指针。如果当前建造者对象为空且已经被组装完成,则直接返回其产品对象指针。如果当前建造者对象为空且还没有被组装完成,则先调用其组装方法组装完成后再返回产品对象指针。
posted @ 2024-02-05 21:19  guanyubo  阅读(13)  评论(0)    收藏  举报