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

    • 演示如何使用建造者模式创建不同类型的产品
    • 通过切换建造者来改变最终产品
    • 保持创建过程的一致性
相关推荐
_哆啦A梦3 小时前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
端平入洛1 天前
delete又未完全delete
c++
端平入洛2 天前
auto有时不auto
c++
哇哈哈20213 天前
信号量和信号
linux·c++
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马3 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝3 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
weiabc3 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法
问好眼3 天前
《算法竞赛进阶指南》0x01 位运算-3.64位整数乘法
c++·算法·位运算·信息学奥赛
yyjtx3 天前
DHU上机打卡D31
开发语言·c++·算法