当前位置: 首页 > ai >正文

C++ 建造者模式详解

建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象,使相同的构建过程可以创建不同的表示。

概念解析

建造者模式的核心思想是:

  1. 分离复杂对象的构建和表示:将对象的构建过程与其表示分离

  2. 分步构建:允许通过一系列步骤构建复杂对象

  3. 灵活配置:相同的构建过程可以创建不同的产品表示

主要组成部分

  1. 产品(Product):最终要构建的复杂对象

  2. 抽象建造者(Builder):定义创建产品各个部件的抽象接口

  3. 具体建造者(Concrete Builder):实现Builder接口,构造和装配产品的各个部件

  4. 指挥者(Director):构建使用Builder接口的对象,控制构建过程

  5. 客户端(Client):创建Director和Builder对象,并启动构建过程

代码示例

下面是一个完整的建造者模式示例,包含详细注释:

#include <iostream>
#include <string>
#include <vector>
#include <memory>// 产品类:汽车
class Car {
private:std::string engine_;std::string transmission_;std::vector<std::string> wheels_;std::vector<std::string> electronics_;public:void setEngine(const std::string& engine) {engine_ = engine;}void setTransmission(const std::string& transmission) {transmission_ = transmission;}void addWheel(const std::string& wheel) {wheels_.push_back(wheel);}void addElectronic(const std::string& electronic) {electronics_.push_back(electronic);}void showDetails() const {std::cout << "汽车配置详情:" << std::endl;std::cout << "发动机: " << engine_ << std::endl;std::cout << "变速箱: " << transmission_ << std::endl;std::cout << "车轮: ";for (const auto& wheel : wheels_) {std::cout << wheel << " ";}std::cout << std::endl;std::cout << "电子设备: ";for (const auto& electronic : electronics_) {std::cout << electronic << " ";}std::cout << std::endl;}
};// 抽象建造者
class CarBuilder {
public:virtual ~CarBuilder() = default;virtual void buildEngine() = 0;virtual void buildTransmission() = 0;virtual void buildWheels() = 0;virtual void buildElectronics() = 0;virtual std::unique_ptr<Car> getCar() = 0;
};// 具体建造者:经济型汽车建造者
class EconomyCarBuilder : public CarBuilder {
private:std::unique_ptr<Car> car_;public:EconomyCarBuilder() {car_ = std::make_unique<Car>();}void buildEngine() override {car_->setEngine("1.5L 自然吸气发动机");}void buildTransmission() override {car_->setTransmission("5速手动变速箱");}void buildWheels() override {for (int i = 0; i < 4; ++i) {car_->addWheel("15寸钢制轮毂");}}void buildElectronics() override {car_->addElectronic("基础音响系统");car_->addElectronic("手动空调");}std::unique_ptr<Car> getCar() override {return std::move(car_);}
};// 具体建造者:豪华型汽车建造者
class LuxuryCarBuilder : public CarBuilder {
private:std::unique_ptr<Car> car_;public:LuxuryCarBuilder() {car_ = std::make_unique<Car>();}void buildEngine() override {car_->setEngine("3.0L V6涡轮增压发动机");}void buildTransmission() override {car_->setTransmission("8速自动变速箱");}void buildWheels() override {for (int i = 0; i < 4; ++i) {car_->addWheel("19寸铝合金轮毂");}}void buildElectronics() override {car_->addElectronic("高级音响系统");car_->addElectronic("自动空调");car_->addElectronic("导航系统");car_->addElectronic("倒车影像");car_->addElectronic("自动驾驶辅助");}std::unique_ptr<Car> getCar() override {return std::move(car_);}
};// 指挥者
class CarManufacturer {
public:std::unique_ptr<Car> buildCar(CarBuilder& builder) {builder.buildEngine();builder.buildTransmission();builder.buildWheels();builder.buildElectronics();return builder.getCar();}
};// 客户端代码
int main() {std::cout << "=== 建造者模式演示 ===" << std::endl;CarManufacturer manufacturer;// 构建经济型汽车std::cout << "\n构建经济型汽车:" << std::endl;EconomyCarBuilder economyBuilder;auto economyCar = manufacturer.buildCar(economyBuilder);economyCar->showDetails();// 构建豪华型汽车std::cout << "\n构建豪华型汽车:" << std::endl;LuxuryCarBuilder luxuryBuilder;auto luxuryCar = manufacturer.buildCar(luxuryBuilder);luxuryCar->showDetails();return 0;
}

模式优势

  1. 分步构建:允许分步骤构建复杂对象,对构建过程有更精细的控制

  2. 隔离构建与表示:将对象的构建与其表示分离

  3. 灵活配置:相同的构建过程可以创建不同的产品表示

  4. 单一职责原则:将复杂构建代码从业务逻辑中分离出来

  5. 更好的控制:相比工厂模式,建造者模式能更好地控制构建过程

适用场景

  1. 当创建复杂对象的算法应该独立于该对象的组成部分及其装配方式时

  2. 当构造过程必须允许被构造的对象有不同的表示时

  3. 当需要创建的对象包含多个组成部分,且这些部分需要按照特定顺序或配置组装时

  4. 当对象的创建过程非常复杂,包含多个步骤或需要特定顺序时

http://www.xdnf.cn/news/3825.html

相关文章:

  • 第13章:陈默再访海奥华
  • QT下根据深度信息计算物体尺寸并UI显示的简单方案
  • 【翻译、转载】MCP 核心架构
  • Docker 容器化部署
  • 信息系统监理师第二版教材模拟题第三组(含解析)
  • CSS定位详解
  • 【Linux系统】条件变量
  • Cona编译问题
  • Web网页布局
  • 赋予网页健壮的灵魂 —— TypeScript(下)
  • Circular Plot系列(五): circle plot展示单细胞互作
  • 电动调节V型球阀的作用:专为颗粒状含碱浆液介质打造的高效解决方案-耀圣
  • 第 14 届蓝桥杯 C++ 青少组省赛中 / 高级组真题解析
  • 开源项目:optimum-quanto库介绍
  • 全面掌握 Jetpack Compose 的 State 体系:核心用法与最佳实践
  • 动态规划(5)路径问题--剑指offer -珠宝的最大值
  • 7 微调 黑盒蒸馏 突破伦理限制
  • STM32外设-GPIO输入(仅数字)
  • [GESP202503 四级] 二阶矩阵c++
  • Spring AI 实战:第八章、Spring AI Tool Calling之与时俱进
  • Android Framework学习三:zygote剖析
  • 轻量化定时工具!Pt 极简界面 :定时备份 + 循环灵活关机
  • 基于springboot3+mybatis整合,使用mybatisPlus插件自动完成简单的 增删改查操作
  • LeetCode 热题 100 189. 轮转数组
  • 多语言笔记系列:Polyglot Notebooks 混合使用多语言并共享变量
  • 第三节:OpenCV 基础入门-安装与配置 OpenCV (Python/C++ 环境)
  • LeetCode 1128.等价多米诺骨牌对的数量:计数
  • 大连理工大学选修课——图形学:第五章 二维变换及二维观察
  • 多语言笔记系列:Polyglot Notebooks 多种使用方式
  • [2025]MySQL的事务机制是什么样的?redolog,undolog、binog三种日志的区别?二阶段提交是什么?ACID怎么保证的?主从复制的过程?