4、跟学23种设计模式(C++版):建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它通过一步一步构建一个复杂对象来提供一种创建对象的方式。建造者模式允许你分步骤创建复杂对象,而不需要了解对象的内部表示。它特别适合用于创建那些包含许多步骤或部件的复杂对象。

特点

1、 分步骤构建:允许对象通过一系列步骤逐步创建;
2、 独立于具体实现:构建过程与表示分离,可以独立变化;
3、 更好的代码复用:不同的建造者可以复用相同的构建过程;
4、 细粒度控制:可以更精细地控制对象的构建过程;
5、 产品的一致性:确保在创建复杂对象时,每个部分都是完整且一致的;

适用场景

1、 对象的创建步骤需要独立顺序执行:例如,创建一个复杂对象时,步骤的顺序很重要;
2、 对象需要多种表示:同一个构建过程可以创建不同的表示;
3、 创建复杂对象:例如,构建一个复杂的产品(例如电脑、房子等),每个产品由多个部件组成;

示例

下面是一个使用C++实现建造者模式的示例。假设我们要构建一个复杂的 Computer 对象,这个对象包含多个部分(CPU、GPU、内存等)。

#include <iostream>
#include <string>

// Product
class Computer {
public:
    void setCPU(const std::string& cpu) { CPU = cpu; }
    void setGPU(const std::string& gpu) { GPU = gpu; }
    void setRAM(const std::string& ram) { RAM = ram; }
    void showSpecs() const {
        std::cout << "CPU: " << CPU << "\n";
        std::cout << "GPU: " << GPU << "\n";
        std::cout << "RAM: " << RAM << "\n";
    }
private:
    std::string CPU;
    std::string GPU;
    std::string RAM;
};

// Builder Interface
class ComputerBuilder {
public:
    virtual void buildCPU() = 0;
    virtual void buildGPU() = 0;
    virtual void buildRAM() = 0;
    virtual Computer* getComputer() = 0;
};

// Concrete Builder
class GamingComputerBuilder : public ComputerBuilder {
public:
    GamingComputerBuilder() { computer = new Computer(); }
    void buildCPU() override { computer->setCPU("Intel i9"); }
    void buildGPU() override { computer->setGPU("NVIDIA RTX 3080"); }
    void buildRAM() override { computer->setRAM("32GB"); }
    Computer* getComputer() override { return computer; }
private:
    Computer* computer;
};

// Director
class Director {
public:
    void setBuilder(ComputerBuilder* builder) { this->builder = builder; }
    Computer* construct() {
        builder->buildCPU();
        builder->buildGPU();
        builder->buildRAM();
        return builder->getComputer();
    }
private:
    ComputerBuilder* builder;
};

// Main function
int main() {
    Director director;
    GamingComputerBuilder builder;

    director.setBuilder(&builder);
    Computer* gamingComputer = director.construct();

    gamingComputer->showSpecs();

    delete gamingComputer;

    return 0;
}

输出

下面是该示例程序的输出,它显示了构建的 Computer 对象的规格:

CPU: Intel i9GPU: NVIDIA RTX 3080RAM:*32GB

示例说明

在这个示例中,我们展示了如何使用建造者模式来构建一个复杂的 Computer 对象。主要包括以下几个部分:

1、 Product(产品类)Computer类,它代表我们要构建的复杂对象包含CPU、GPU和RAM三个部分,以及相应的设置和显示规格的方法;
2、 Builder(建造者接口)ComputerBuilder是一个抽象类,定义了构建产品各部分的方法具体的建造者类将实现这些方法;
3、 ConcreteBuilder(具体建造者)GamingComputerBuilder继承自ComputerBuilder,实现了构建具体Computer对象的步骤,包括设置CPU、GPU和RAM;
4、 Director(指挥者)Director类负责控制构建过程,接收一个ComputerBuilder对象,通过调用建造者的构建方法来创建产品;
5、 Client(客户端代码):在main函数中,客户端代码创建了一个Director和一个GamingComputerBuilder对象,指挥者根据具体建造者对象构建出一个Computer对象,并显示其规格;

*

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: