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

建造者模式C++

建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。这种模式特别适合创建具有多个组成部分、配置复杂的对象。

建造者模式的核心角色

  1. Product(产品):被构建的复杂对象
  2. Builder(抽象建造者):定义构建产品各部分的接口
  3. ConcreteBuilder(具体建造者):实现抽象建造者接口,构建具体产品
  4. Director(指挥者):控制构建过程,按顺序调用建造者的方法

C++实现示例

以下以"电脑"为例实现建造者模式,电脑由主板、CPU、内存、显卡等部件组成,我们可以通过不同的建造者创建不同配置的电脑。

#include <iostream>
#include <string>
#include <vector>// 产品:电脑
class Computer {
private:std::string motherboard;  // 主板std::string cpu;          // CPUstd::string memory;       // 内存std::string graphicsCard; // 显卡std::string storage;      // 存储设备public:void setMotherboard(const std::string& mb) { motherboard = mb; }void setCPU(const std::string& c) { cpu = c; }void setMemory(const std::string& m) { memory = m; }void setGraphicsCard(const std::string& gc) { graphicsCard = gc; }void setStorage(const std::string& s) { storage = s; }// 显示电脑配置void showConfiguration() const {std::cout << "电脑配置:\n";std::cout << "主板: " << motherboard << "\n";std::cout << "CPU: " << cpu << "\n";std::cout << "内存: " << memory << "\n";std::cout << "显卡: " << graphicsCard << "\n";std::cout << "存储: " << storage << "\n\n";}
};// 抽象建造者
class ComputerBuilder {
public:virtual ~ComputerBuilder() = default;virtual void buildMotherboard() = 0;virtual void buildCPU() = 0;virtual void buildMemory() = 0;virtual void buildGraphicsCard() = 0;virtual void buildStorage() = 0;virtual Computer* getResult() = 0;
};// 具体建造者:游戏电脑建造者
class GamingComputerBuilder : public ComputerBuilder {
private:Computer* computer;public:GamingComputerBuilder() { computer = new Computer(); }~GamingComputerBuilder() { delete computer; }void buildMotherboard() override {computer->setMotherboard("高端游戏主板");}void buildCPU() override {computer->setCPU("高性能多核处理器");}void buildMemory() override {computer->setMemory("32GB 高频内存");}void buildGraphicsCard() override {computer->setGraphicsCard("顶级独立显卡");}void buildStorage() override {computer->setStorage("1TB NVMe SSD");}Computer* getResult() override {return computer;}
};// 具体建造者:办公电脑建造者
class OfficeComputerBuilder : public ComputerBuilder {
private:Computer* computer;public:OfficeComputerBuilder() { computer = new Computer(); }~OfficeComputerBuilder() { delete computer; }void buildMotherboard() override {computer->setMotherboard("普通办公主板");}void buildCPU() override {computer->setCPU("中端处理器");}void buildMemory() override {computer->setMemory("16GB 内存");}void buildGraphicsCard() override {computer->setGraphicsCard("集成显卡");}void buildStorage() override {computer->setStorage("512GB SSD");}Computer* getResult() override {return computer;}
};// 指挥者:指导建造过程
class Director {
public:// 按固定流程构建电脑void construct(ComputerBuilder* builder) {builder->buildMotherboard();builder->buildCPU();builder->buildMemory();builder->buildGraphicsCard();builder->buildStorage();}
};int main() {Director director;// 构建游戏电脑ComputerBuilder* gamingBuilder = new GamingComputerBuilder();director.construct(gamingBuilder);Computer* gamingPC = gamingBuilder->getResult();std::cout << "游戏电脑:\n";gamingPC->showConfiguration();// 构建办公电脑ComputerBuilder* officeBuilder = new OfficeComputerBuilder();director.construct(officeBuilder);Computer* officePC = officeBuilder->getResult();std::cout << "办公电脑:\n";officePC->showConfiguration();// 清理资源delete gamingBuilder;  // 注意:会同时删除内部的Computer对象delete officeBuilder;return 0;
}

代码解析

  1. Computer类:表示被构建的复杂产品,包含多个组件(主板、CPU等)和展示配置的方法。

  2. ComputerBuilder类:抽象建造者,定义了构建电脑各组件的接口方法,以及获取最终产品的方法。

  3. 具体建造者

    • GamingComputerBuilder:构建高性能游戏电脑,各组件都选择高端配置
    • OfficeComputerBuilder:构建办公电脑,配置满足日常办公需求即可
  4. Director类:指挥者,负责控制构建流程,按固定顺序调用建造者的方法,使构建过程标准化。

建造者模式的优缺点

优点

  • 将复杂对象的构建与表示分离,客户端无需知道内部组成细节
  • 可以灵活切换不同的建造者,得到不同的产品配置
  • 便于扩展新的建造者,符合开放-封闭原则
  • 控制了对象的构建过程,确保构建步骤的完整性

缺点

  • 增加了类的数量,系统复杂度有所提高
  • 如果产品内部结构变化频繁,需要修改所有建造者类

适用场景

  • 当创建的对象具有复杂的内部结构(包含多个成员变量)
  • 当需要创建的对象有不同的配置或表示形式
  • 当希望隐藏复杂对象的创建细节,只暴露构建过程

常见应用:

  • 文档生成器(如生成不同格式的文档:PDF、HTML等)
  • 游戏角色创建(不同职业、不同装备的角色)
  • 汽车制造(不同型号、配置的汽车)
  • 数据库连接配置构建

建造者模式与工厂模式的区别在于:工厂模式注重整体对象的创建,而建造者模式注重对象的分步构建过程,适合创建复杂对象。

http://www.dtcms.com/a/331388.html

相关文章:

  • 串口通信中,实现串口接收函数时,避免数据丢失或被覆盖的方法
  • 20250814在荣品RD-RK3588开发板的Android13下解决卡迪的LCD屏在开机的时候brightness最暗【背光的pwm信号的极性反了】
  • 机器学习核心概念与实践笔记
  • 安卓设备通过USB,连接继电器,再通过继电器开关闸机
  • 前端包管理工具
  • 【FreeRTOS】任务管理:创建与删除任务,任务优先级与阻塞
  • 计算机网络---传输控制协议Transmission Control Protocol(TCP)
  • Redis的 ​​散列(Hash)​​ 和 ​​列表(List)​​ 数据结构操作详解
  • 力扣-64.最小路径和
  • 【AI推理部署教程】使用 vLLM 运行智谱 GLM-4.5V 视觉语言模型推理服务
  • 电商双 11 美妆数据分析总结(补充)
  • 入门概述(面试常问)
  • 中久数创——笔试题
  • Android构建工具版本兼容性对照表
  • Git 中切换到指定 tag
  • 会议系统核心流程详解:创建、加入与消息交互
  • 卫星通信链路预算之七:上行载噪比计算
  • MySQL-dble分库分表方案
  • 【最新版】怎么下载mysqlclient并成功安装?
  • 物化视图优先迁移大表,缩短逻辑迁移时间
  • MySql——binlog和redolog的区别
  • uniapp开发动态添加密码验证
  • Go语言全面解析:从入门到精通
  • C/C++ 指针与内存操作详解——从一级指针到字符串转换函数的完整解析
  • 拒绝“孤岛式”作战,全方位构筑隧道应急通信解决方案
  • Java 学习笔记(基础篇2)
  • 13、C 语言结构体尺寸知识点总结
  • LeetCode 刷题【41. 缺失的第一个正数】
  • 【力扣322】零钱兑换
  • 非容器方式安装Prometheus和Grafana,以及nginx配置访问Grafana