【C++设计模式之建造者模式:创建型】分析及示例

简介

建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

描述

建造者模式通过将一个复杂对象的构建过程拆分成多个简单的部分,并由不同的建造者构建每个部分,最终组装成整的对象。这种方式可以灵活地构建不同的对象表示,同时封装了对象的构建过程。

原理

建造者模式的核心思想是将一个复杂对象的构建过程与其表示分离。通常,一个建造者接口定义了构建每个部分的方法,一个具体的建造者实现了该接口,并负责构建每个部分。最后,一个指挥者类根据具体的构建者来组装构建过程,并返回构建完成的对象。

类图

建造者模式中有几个角色:

  1. Director:导演类,按照已有的顺序告诉Builder建造
  2. Builder:抽象建造者,规范建造的方法
  3. ConcreteBuilder:具体的建造者,复实现抽象建造者的方法,并返回一个产品
  4. Product:产品类

示例

假设要构建一个电脑对象,该电脑对象包含CPU、内存和硬盘等部件。

  1. 创建一个电脑建造者接口(ComputerBuilder),其中定义了构建每个部分的方法。
  2. 创建了具体的电脑建造者类(ConcreteComputerBuilder),实现了建造者接口,并负责构建每个部分。
  3. 创建一个指挥者类(Director),根据具体的建造者来组装构建过程,并最终返回构建好的电脑对象。

C++示例代码如下:

cpp 复制代码
#include <iostream>
using namespace std;

// 电脑类
class Computer {
public:
    void setCPU(const string& cpu) {
        this->cpu cpu;
    }
    void setMemory(const string& memory) {
        this->memory = memory;
    }
    void setHardDrive(const string& hardDrive) {
        this->hardDrive = hardDrive;
    }
    void showInfo() const {
        cout << "CPU: " << cpu << endl;
        cout << "Memory: " << memory << endl;
        cout << "Hard Drive: " << hardDrive << endl;
    }
private:
    string cpu;
    string memory;
    string hardDrive;
};

// 电脑建造者接口
class ComputerBuilder {
public:
    virtual void buildCPU() = 0;
    virtual void buildMemory() = 0;
    virtual void buildHardDrive() = 0;
    virtual Computer* get() = 0;
};

// 具体的电脑建造者
class ConcreteComputerBuilder : public ComputerBuilder {
public:
    ConcreteComputerBuilder() {
        computer = new Computer();
    }

    void buildCPU() override {
        computer->setCPU("Intel Core i7");
    }
    void buildMemory() override {
        computer->setMemory("16GB");
    }
    void buildHardDrive() override {
        computer->setHardDrive("1TB SSD");
    }
    Computer* getComputer() override {
        return computer;
    }

private:
    Computer* computer;
};

// 指挥者
class Director {
public:
    void setComputerBuilder(ComputerBuilder* builder)
    {
    	this->builder = builder;
    }

    void constructComputer() {
        builder->buildCPU();
 		builder->buildMemory();
        builder->buildHardDrive();
    }

private:
    ComputerBuilder* builder;
};

// 使用示例
int main() {
    Director director;
    ConcreteComputerBuilder builder;
    director.setComputerBuilder(&builder);
    director.constructComputer();

    Computer* computer = builder.getComputer();
    computer->showInfo();

    delete computer;

    return 0;
}

输出结果

cpp 复制代码
CPU: Intel Core i7
Memory: 16GB
Hard Drive: 1TB SSD

解释

在上述示例中,首先定义了电脑类(Computer),其中包含了一些电脑的属性和显示信息的方法。

然后,创建了电脑建造者接口(ComputerBuilder),其中定义了构建每个部分的抽象方法,并定义了获取构建好的电脑的方法。

接着,创建了具体的电脑建造者类(ConcreteComputerBuilder),它实现了电脑建造者接口,并负责构建每个部分。

最后,创建了一个指挥者类(Director),它接收一个具体的建造者,并根据这个建造者来组装建过程。

在示例中,通过调用指挥者的constructComputer方法来使用具体的建造者构建电脑对象。最终,通过调用建造者的getComputer方法来获取构建好电脑对象,并调用它的showInfo方法来显示电脑的信息。

结论

建造者模式通过将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它提供了更加灵活和可复用的方式来构建复杂对象。

应用场景

建造者模式适用于以下情况:

  1. 当需要创建具有复杂内部结构的对象时,使用建造者模式可以简化构建过程;
  2. 当需要构建的对象具有不同的表示时,使用建造者模式可以根据不同的建造者生成不同的对象表示;
  3. 当需要封装对象的构建过程,以便于修改或扩展时,使用建造者模式可以将构建过程与表示分离,减少代码的耦合度。

建造者模式可以应用于各种场景,如复杂对象的构建、流程控制、组装不同的表示等。它通过将构建过程拆分为多个简单的部分,使得构建过程可控制和可扩,提供了更加灵活和可复用对象构建方式。

相关推荐
GIS阵地3 小时前
QgsRasterDataProvider 完整详解(QGIS 3.40.13 C++)
开发语言·c++·qt·开源软件·qgis
ttod_qzstudio4 小时前
【软考设计模式】备忘录模式:对象状态的捕获与无损恢复精讲
设计模式·备忘录模式
ttod_qzstudio4 小时前
【软考设计模式】责任链模式:请求传递的多级处理与发送接收解耦精讲
设计模式·责任链模式
charlie1145141915 小时前
Cinux: 为大内核铺路
开发语言·c++·操作系统·现代c++
2501_914245935 小时前
C语言设计模式详解:从理论到实践的完整指南
c语言·开发语言·设计模式
米罗篮7 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
肖爱Kun7 小时前
C++设计策略模式
开发语言·c++·策略模式
炸膛坦客8 小时前
单片机/C/C++八股:(二十四)编译文件( .bin 和 .hex ,包括 .elf 和 .axf )
c语言·c++·单片机
CaffeinePro9 小时前
四⼤极简架构原则KISS/DRY/YAGNI/LOD
设计模式·架构
cpp_25019 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解