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

以下是一个完整的C++建造者模式示例,包含产品类、建造者接口、具体建造者、指挥者以及测试代码:

cpp 复制代码
#include <iostream>
#include <string>
#include <memory>

// 产品类:汽车
class Car {
public:
    void setBody(const std::string& body) { m_body = body; }
    void setEngine(const std::string& engine) { m_engine = engine; }
    void setWheels(int wheels) { m_wheels = wheels; }
    void setElectronics(const std::string& electronics) { m_electronics = electronics; }

    void show() const {
        std::cout << "Car Details:\n"
                  << "Body: " << m_body << "\n"
                  << "Engine: " << m_engine << "\n"
                  << "Wheels: " << m_wheels << "\n"
                  << "Electronics: " << m_electronics << "\n\n";
    }

private:
    std::string m_body;
    std::string m_engine;
    int m_wheels = 0;
    std::string m_electronics;
};

// 抽象建造者
class CarBuilder {
public:
    virtual ~CarBuilder() = default;
    virtual void buildBody() = 0;
    virtual void buildEngine() = 0;
    virtual void buildWheels() = 0;
    virtual void buildElectronics() = 0;
    virtual Car getResult() = 0;
};

// 具体建造者:运动型汽车
class SportsCarBuilder : public CarBuilder {
public:
    void buildBody() override { m_car.setBody("Carbon Fiber Body"); }
    void buildEngine() override { m_car.setEngine("V8 Twin Turbo"); }
    void buildWheels() override { m_car.setWheels(4); }
    void buildElectronics() override { m_car.setElectronics("Racing Package"); }
    Car getResult() override { return std::move(m_car); }

private:
    Car m_car;
};

// 具体建造者:家用汽车
class FamilyCarBuilder : public CarBuilder {
public:
    void buildBody() override { m_car.setBody("Steel Body"); }
    void buildEngine() override { m_car.setEngine("1.6L Inline-4"); }
    void buildWheels() override { m_car.setWheels(4); }
    void buildElectronics() override { m_car.setElectronics("Basic Package"); }
    Car getResult() override { return std::move(m_car); }

private:
    Car m_car;
};

// 指挥者
class Director {
public:
    void setBuilder(CarBuilder* builder) { m_builder = builder; }

    void constructCar() {
        m_builder->buildBody();
        m_builder->buildEngine();
        m_builder->buildWheels();
        m_builder->buildElectronics();
    }

private:
    CarBuilder* m_builder;
};

// 测试代码
int main() {
    Director director;
    
    // 建造运动型汽车
    SportsCarBuilder sportsBuilder;
    director.setBuilder(&sportsBuilder);
    director.constructCar();
    Car sportsCar = sportsBuilder.getResult();
    sportsCar.show();

    // 建造家用汽车
    FamilyCarBuilder familyBuilder;
    director.setBuilder(&familyBuilder);
    director.constructCar();
    Car familyCar = familyBuilder.getResult();
    familyCar.show();

    return 0;
}

输出结果:

复制代码
Car Details:
Body: Carbon Fiber Body
Engine: V8 Twin Turbo
Wheels: 4
Electronics: Racing Package

Car Details:
Body: Steel Body
Engine: 1.6L Inline-4
Wheels: 4
Electronics: Basic Package

代码结构说明:

  1. Car类:最终要构建的复杂对象,包含车身、发动机、轮子等组件

  2. CarBuilder抽象类

    • 定义构建汽车各个组件的接口
    • 包含4个纯虚函数用于构建不同部件
    • 提供获取最终产品的接口
  3. 具体建造者

    • SportsCarBuilder:实现运动型汽车的建造细节
    • FamilyCarBuilder:实现家用汽车的建造细节
    • 每个具体建造者维护自己的Car实例
  4. Director类

    • 控制建造流程
    • 定义建造顺序(先车身→发动机→轮子→电子设备)
    • 通过组合不同的建造者来创建不同产品
  5. 测试代码

    • 演示如何使用建造者模式创建不同类型的产品
    • 通过切换建造者来改变最终产品
    • 保持创建过程的一致性
相关推荐
汉汉汉汉汉1 小时前
C++11新特性详解:从列表初始化到线程库
c++
楼田莉子2 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
大锦终3 小时前
【算法】模拟专题
c++·算法
whitepure4 小时前
万字详解Java中的面向对象(二)——设计模式
java·设计模式
方传旺4 小时前
C++17 std::optional 深拷贝 vs 引用:unordered_map 查询大对象性能对比
c++
Dontla4 小时前
Makefile介绍(Makefile教程)(C/C++编译构建、自动化构建工具)
c语言·c++·自动化
何妨重温wdys4 小时前
矩阵链相乘的最少乘法次数(动态规划解法)
c++·算法·矩阵·动态规划
重启的码农4 小时前
ggml 介绍 (6) 后端 (ggml_backend)
c++·人工智能·神经网络
重启的码农4 小时前
ggml介绍 (7)后端缓冲区 (ggml_backend_buffer)
c++·人工智能·神经网络
雨落倾城夏未凉5 小时前
5.通过拷贝构造函数复制一个对象,假如对象的成员中有个指针类型的变量,如何避免拷贝出来的副本中的该成员之下行同一块内存(等价于默认拷贝构造函数有没有缺点)
c++·后端