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

    • 演示如何使用建造者模式创建不同类型的产品
    • 通过切换建造者来改变最终产品
    • 保持创建过程的一致性
相关推荐
syagain_zsx5 小时前
WebSocket 教程:websocketpp 写 echo 服务端
linux·网络·c++·websocket·网络协议·工具库
大陈子编程6 小时前
C++ CSP-J 与 CSP-S 题单:洛谷 140 题知识点全覆盖
c++
张小姐的猫6 小时前
【MySQL】数据类型
android·linux·数据库·c++·mysql·adb·php
讳疾忌医丶6 小时前
编译器眼中的 C++ 循环:从指针别名、IEEE 754 结合律到 SIMD 语义证明
开发语言·c++
小徐不徐说7 小时前
C++ 机器视觉入门:从零搭建 AOI 开发环境(OpenCV + CMake)
开发语言·c++·opencv
誰能久伴不乏7 小时前
【无标题】
c++·qt·机器人
大陈子编程8 小时前
C++ 背包九讲:从入门到精通的动态规划专题
开发语言·c++·动态规划
zzu123zsw8 小时前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计
牧瀬クリスだ9 小时前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
拆房老料12 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt