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. 测试代码

    • 演示如何使用建造者模式创建不同类型的产品
    • 通过切换建造者来改变最终产品
    • 保持创建过程的一致性
相关推荐
2401_8318249620 分钟前
基于C++的区块链实现
开发语言·c++·算法
汉克老师1 小时前
GESP5级C++考试语法知识(六、链表(一)单链表)
c++·链表·单链表·快慢指针·进阶·gesp5级·gesp五级
m0_518019481 小时前
C++与机器学习框架
开发语言·c++·算法
qq_417695051 小时前
C++中的代理模式高级应用
开发语言·c++·算法
学嵌入式的小杨同学1 小时前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
xiaoye-duck2 小时前
《算法题讲解指南:动态规划算法--路径问题》--5.不同路径,6.不同路径II
c++·算法·动态规划
ambition202422 小时前
最大子数组和算法全解析:从暴力枚举到动态规划优化
数据结构·c++·算法
qq_461489332 小时前
C++与Qt图形开发
开发语言·c++·算法
小菜鸡桃蛋狗3 小时前
C++——类和对象(上)
开发语言·c++
2401_879503414 小时前
C++中的观察者模式变体
开发语言·c++·算法