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

设计模式---构建者模式(Builder Pattern)

构建者模式(Builder Pattern) 是一种创建型设计模式,旨在将复杂对象的构建过程与其表示分离。它允许使用相同的构建过程创建不同的表示。该模式通常用于构建复杂对象,这些对象由多个部分组成或具有多个可选属性。

构建者模式的核心要素

  1. Builder(构建者):定义构建对象的接口,声明创建部分对象的方法。
  2. ConcreteBuilder(具体构建者):实现 Builder 接口,构建并装配各个部件,提供一个方法以获取最终构建的对象。
  3. Director(指挥者):构建过程中的协调者,使用 Builder 对象来构建产品。
  4. Product(产品):由 Builder 构建的最终对象,通常包含多个部件。

示例:创建一个复杂的 Computer 对象

我们将使用构建者模式来创建一个 Computer 对象。一个 Computer 可能包括处理器、内存、硬盘和显卡等部件。

1. 定义 Computer 类(产品)
#include <string>
#include <iostream>class Computer {
public:void setCPU(const std::string &cpu) { m_cpu = cpu; }void setRAM(const std::string &ram) { m_ram = ram; }void setStorage(const std::string &storage) { m_storage = storage; }void setGPU(const std::string &gpu) { m_gpu = gpu; }void showSpecs() const {std::cout << "Computer Specifications:" << std::endl;std::cout << "CPU: " << m_cpu << std::endl;std::cout << "RAM: " << m_ram << std::endl;std::cout << "Storage: " << m_storage << std::endl;std::cout << "GPU: " << m_gpu << std::endl;}private:std::string m_cpu;std::string m_ram;std::string m_storage;std::string m_gpu;
};

2. 定义 Builder 接口

class ComputerBuilder {
public:virtual ~ComputerBuilder() = default;virtual void buildCPU() = 0;virtual void buildRAM() = 0;virtual void buildStorage() = 0;virtual void buildGPU() = 0;virtual Computer* getComputer() = 0;
};

3. 定义 ConcreteBuilder(具体构建者)

class GamingComputerBuilder : public ComputerBuilder {
public:GamingComputerBuilder() { m_computer = new Computer(); }~GamingComputerBuilder() { delete m_computer; }void buildCPU() override { m_computer->setCPU("High-end CPU"); }void buildRAM() override { m_computer->setRAM("16GB RAM"); }void buildStorage() override { m_computer->setStorage("1TB SSD"); }void buildGPU() override { m_computer->setGPU("High-end GPU"); }Computer* getComputer() override { return m_computer; }private:Computer* m_computer;
};

4. 定义 Director(指挥者)

class ComputerDirector {
public:ComputerDirector(ComputerBuilder* builder) : m_builder(builder) {}void construct() {m_builder->buildCPU();m_builder->buildRAM();m_builder->buildStorage();m_builder->buildGPU();}private:ComputerBuilder* m_builder;
};

5. 使用构建者模式

int main() {// 创建具体构建者对象ComputerBuilder* builder = new GamingComputerBuilder();// 创建指挥者对象,并传入具体构建者ComputerDirector director(builder);// 开始构建过程director.construct();// 获取构建完成的产品Computer* computer = builder->getComputer();computer->showSpecs();// 清理资源delete computer;delete builder;return 0;
}

解释

  • Computer 类是最终构建的对象,包含多个属性(部件)。
  • ComputerBuilder 是构建者接口,定义了构建每个部件的方法。
  • GamingComputerBuilder 是一个具体构建者,实现了构建每个部件的方法,并返回最终构建的 Computer 对象。
  • ComputerDirector 使用构建者来构建产品,它知道如何一步一步地构建 Computer 对象,但不直接处理构建过程的细节。
  • main 函数 中创建了一个 GamingComputerBuilder 实例和一个 ComputerDirector 实例,然后使用 ComputerDirector 来构建 Computer 对象,并显示其规格。

通过构建者模式,你可以轻松地创建不同配置的 Computer 对象(如 GamingComputerBuilder),并且可以在不改变构建过程的情况下,创建其他类型的计算机(例如 OfficeComputerBuilder)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 详解线索分层的目的、维度与创新实践
  • 【Java】了解线程 Thread 类的使用,如何创建、终止、等待一个线程,一文读懂不迷路
  • 【论文学习与撰写】快捷搜索指令filetype:pdf,搜索引擎关键词搜索pdf格式文件或者word格式文件。文献搜索方法大全。
  • 26 slave写入数据解决与GTIDS主从复制搭建
  • 白骑士的C#教学实战项目篇 4.4 游戏开发
  • 《向量数据库指南》——解决方案:采用安全、高性能的Milvus Cloud向量数据库,赋能Dopple AI的创新与发展
  • 速盾:博客主机租用怎么提高访问速度呢?
  • “LOCAL_LISTENER”参数导致业务无法连接数据库,文末附Oracle连接故障检查监听的排查流程
  • 如何高效的利用低代码技术进行数据建模
  • Temu全托管和半托管的区别:一文说清temu全托和半托的差异
  • 项目启动报错:liquibase.lockservice:? - Waiting for changelog lock....
  • 智能监控,无忧仓储:EasyCVR视频汇聚+AI智能分享技术为药品仓库安全保驾护航
  • PyQt5创建多个子窗口并监控其状态
  • 代码随想录算法day19 | 回溯算法part01 | 77. 组合,216.组合总和III,17.电话号码的字母组合
  • 【pdf文件生成】如何将盖章的文件生成PDF文件
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • C# 免费离线人脸识别 2.0 Demo
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6语法详解(一)
  • Java编程基础24——递归练习
  • JS题目及答案整理
  • Laravel Mix运行时关于es2015报错解决方案
  • Laravel Telescope:优雅的应用调试工具
  • node-glob通配符
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python学习之路13-记分
  • TCP拥塞控制
  • WePY 在小程序性能调优上做出的探究
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 前端学习笔记之观察者模式
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 想使用 MongoDB ,你应该了解这8个方面!
  • k8s使用glusterfs实现动态持久化存储
  • postgresql行列转换函数
  • Spring Batch JSON 支持
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #宝哥教你#查看jquery绑定的事件函数
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (二)windows配置JDK环境
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (一)UDP基本编程步骤
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • . Flume面试题
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .gitattributes 文件
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .Net的C#语言取月份数值对应的MonthName值
  • .net反混淆脱壳工具de4dot的使用