引言

在软件开发中,构建复杂对象时常常会遇到构造函数或setter方法过于复杂的情况。Builder模式作为一种创建型设计模式,能够有效地解决这一问题。Guoyao 创建的勇勇(YongYong)角色,通过Builder模式实现了对复杂对象的构建过程与表示的分离,展示了Builder模式在实际项目中的应用。本文将详细介绍Builder模式在C++中的实现,以及其如何满足各种面向对象设计原则。

1. Builder模式简介

Builder模式的核心思想是将复杂对象的构建过程与其表示分离,使得同样的构建过程可以生成不同的表示。这种分离不仅提高了代码的灵活性和可维护性,还支持不同的构建策略。

Builder模式主要包括以下几个角色:

  • Product(产品) :要构建的复杂对象。
  • Builder(构建者) :定义构建Product各个部分的接口。
  • ConcreteBuilder(具体构建者) :实现Builder接口,构建和组装Product的各个部分。
  • Director(指挥者) :负责管理构建过程,协调各个构建步骤。

2. 勇勇(YongYong)角色的需求分析

勇勇(YongYong)角色需要具备以下属性:

  • 饭碗(BowlOfRice) :表示勇勇的基本生存需求。
  • 权力(Power) :表示勇勇拥有的权力和影响力。
  • 客户(Customer) :表示勇勇服务的对象。
  • 小兵(Soldier) :表示勇勇领导的下属。

通过Builder模式,我们可以分步构建勇勇(YongYong)对象,确保每个部分的构建逻辑清晰且易于扩展。

3. C++代码实现

3.1 定义各个部分的类

首先,定义勇勇需要的各个部分的类。每个类都提供一个抽象接口,具体实现由子类完成。

// 饭碗类
class BowlOfRice {
public:virtual ~BowlOfRice() = default;virtual void eat() = 0;
};// 权力类
class Power {
public:virtual ~Power() = default;virtual void exercise() = 0;
};// 客户类
class Customer {
public:virtual ~Customer() = default;virtual void request() = 0;
};// 小兵类
class Soldier {
public:virtual ~Soldier() = default;virtual void obey() = 0;
};

3.2 定义勇勇(YongYong)类

勇勇类包含上述各个部分的指针,并提供一个work()方法来协调各个部分的工作。

class YongYong {
private:BowlOfRice* bowlOfRice;Power* power;Customer* customer;Soldier* soldier;public:YongYong(BowlOfRice* bowl, Power* pow, Customer* cust, Soldier* sold): bowlOfRice(bowl), power(pow), customer(cust), soldier(sold) {}~YongYong() {delete bowlOfRice;delete power;delete customer;delete soldier;}void work() {bowlOfRice->eat();power->exercise();customer->request();soldier->obey();}
};

3.3 定义Builder接口

Builder接口定义了构建勇勇对象各个部分的方法。

class GuoyaoBuilder {
public:virtual ~GuoyaoBuilder() = default;virtual void buildBowlOfRice() = 0;virtual void buildPower() = 0;virtual void buildCustomer() = 0;virtual void buildSoldier() = 0;virtual YongYong* getResult() = 0;
};

3.4 实现具体构建者

具体构建者(Guoyao)实现了Builder接口,构建勇勇对象的各个部分。

class Guoyao : public GuoyaoBuilder {
private:YongYong* yongYong;public:Guoyao() {yongYong = new YongYong(nullptr, nullptr, nullptr, nullptr);}~Guoyao() {delete yongYong;}void buildBowlOfRice() override {yongYong->bowlOfRice = new BowlOfRice() {void eat() override {// 具体实现}};}void buildPower() override {yongYong->power = new Power() {void exercise() override {// 具体实现}};}void buildCustomer() override {yongYong->customer = new Customer() {void request() override {// 具体实现}};}void buildSoldier() override {yongYong->soldier = new Soldier() {void obey() override {// 具体实现}};}YongYong* getResult() override {return yongYong;}
};

3.5 定义指挥者

指挥者(Director)负责管理构建过程,协调各个构建步骤。

class Director {
private:GuoyaoBuilder* guoyao;public:Director(GuoyaoBuilder* g) : guoyao(g) {}~Director() {delete guoyao;}YongYong* construct() {guoyao->buildBowlOfRice();guoyao->buildPower();guoyao->buildCustomer();guoyao->buildSoldier();return guoyao->getResult();}
};

3.6 客户端代码

客户端代码通过指挥者和构建者来构建勇勇对象,并使用它。

int main() {// 创建具体构建者GuoyaoBuilder* guoyao = new Guoyao();// 创建指挥者Director* director = new Director(guoyao);// 构建勇勇对象YongYong* yongYong = director->construct();// 使用勇勇对象yongYong->work();// 释放内存delete yongYong;delete director;return 0;
}

4. 面向对象设计原则的满足情况

Builder模式在实现过程中满足了多种面向对象设计原则,这些原则有助于提高代码的灵活性、可扩展性和可维护性。

4.1 单一职责原则(SRP)

  • 描述:一个类应该只有一个改变的原因。
  • 应用:每个类(如BowlOfRicePowerYongYongDirector)只负责一个职责,确保职责明确。

4.2 开闭原则(OCP)

  • 描述:软件实体应该是开放的扩展,但关闭的修改。
  • 应用:通过定义抽象的GuoyaoBuilder接口,允许通过实现新的Builder类来扩展构建过程,而无需修改现有的DirectorYongYong类。

4.3 里氏替换原则(LSP)

  • 描述:子类应该能够替换它们的父类而不导致错误。
  • 应用:Guoyao实现了GuoyaoBuilder接口,可以替换其父类而不影响Director类的功能。

4.4 依赖倒置原则(DIP)

  • 描述:依赖于抽象而不是具体实现。
  • 应用:Director类依赖于抽象的GuoyaoBuilder接口,而不是具体的实现,符合DIP。

4.5 接口隔离原则(ISP)

  • 描述:客户端不应该依赖它不需要的接口。
  • 应用:GuoyaoBuilder接口只定义了构建对象所需的最小方法集合,客户端(如Director类)只需要知道这些方法。

4.6 合成复用原则(CRP)

  • 描述:优先使用组合而不是继承来实现复用。
  • 应用:通过组合不同的构建步骤来构建复杂对象,而不是通过继承来复用代码。

4.7 迪米特法则(Law of Demeter)

  • 描述:一个类应该只与它直接相关的类交互。
  • 应用:Director类只与GuoyaoBuilder接口交互,而不直接与具体的构建部分(如BowlOfRicePower等)交互。

5. 表格总结:Builder模式在C++中的实现步骤和代码结构

步骤描述代码实现
1. 定义部分类定义“勇勇”需要的各个部分的类。cpp BowlOfRice, Power, Customer, Soldier
2. 定义“勇勇”类包含各个部分的指针,并提供构建方法。cpp class YongYong
3. 定义Builder接口定义构建各个部分的方法。cpp class GuoyaoBuilder
4. 实现具体构建者实现Builder接口,构建各个部分。cpp class Guoyao
5. 定义指挥者管理构建过程,协调各个构建步骤。cpp class Director
6. 客户端代码使用Builder模式构建“勇勇”对象。cpp main()

6. 脑图展示

以下是用脑图展示的各个类之间的关系和交互:

graph TDA[Director] --> B[GuoyaoBuilder]B --> C[buildBowlOfRice()]B --> D[buildPower()]B --> E[buildCustomer()]B --> F[buildSoldier()]B --> G[YongYong]G --> H[BowlOfRice]G --> I[Power]G --> J[Customer]G --> K[Soldier]H --> L[eat()]I --> M[exercise()]J --> N[request()]K --> O[obey()]

7. 总结

通过Guoyao创建的勇勇(YongYong)角色,我们展示了Builder模式在C++中的实现。Builder模式通过分离对象的构建过程和表示,提供了一种灵活且可维护的方式来构建复杂对象。通过引入Builder、ConcreteBuilder和Director角色,能够有效管理构建逻辑,提高代码的可扩展性和复用性。

本文不仅详细介绍了Builder模式的实现步骤,还分析了其如何满足各种面向对象设计原则。希望读者通过本文能够更好地理解Builder模式在实际项目中的应用,以及如何通过遵循设计原则来提高代码质量。

8. 参考资料

  • 《设计模式:可复用面向对象软件的基础》(Gang of Four)
  • C++编程规范和最佳实践 修改一下这篇文章的题目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91529.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91529.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91529.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gradio作为原型工具

存在的问题,页面的展示和value不是同一个值的问题,比如说选中了北京,但实际上后端想要的是110000地区码。 在实际开发中,前端展示给用户的是可读的地区名称(如“北京”),而背后处理时通常需要的…

计算声子谱

准备的还是vasp的必备文件&#xff1a;POSCAR POTCAR KPOINTS&#xff0c;剩下需要的INCAR、band文件下面代码可以生成&#xff1a;#!/bin/bash if [ ! -f band.conf ];then cat >>band.conf <<EOF ATOM_NAME Ti Al B DIM 1 1 1 BAND 0.0 0.0 0.0 0.5 -0.5 0.5…

深度学习 目标检测常见指标和yolov1分析

目录 一、常见指标 1、IoU 2、Confidence置信度 3、精准度和召回率 4、mAP 5、NMS方法 6、检测速度 前传耗时 FPS 7、FLOPs 二、YOLOv1 检测流程 1、图像网格划分 2、类别预测 3、输出张量 损失函数 优点 缺点 如题&#xff0c;这篇介绍一下目标检测中常见的…

31. 伪类和伪元素区别

总结 选择对象不同内容说明伪类作用对象元素的状态或位置伪元素作用对象元素的一部分内容或虚拟内容是否新增节点均不新增节点常用符号:&#xff08;伪类&#xff09;、::&#xff08;伪元素&#xff09;推荐场景伪类用于交互与状态控制&#xff1b;伪元素用于样式修饰与内容插…

ChatGPT、Playground手动模拟Agent摘要缓冲混合记忆功能

01. 摘要缓冲混合记忆 摘要缓冲混合记忆中&#xff0c;所需的模块有&#xff1a; chat_message_history&#xff1a;存储历史消息列表。moving_summary_buffer&#xff1a;移除消息的汇总字符串。summary_llm&#xff1a;生成摘要的 LLM&#xff0c;接收 summary&#xff08;…

全国青少年信息素养大赛(无人飞行器主题赛(星际迷航)游记)

作者 FHD_WOLF 发布时间 2025-07-30 21:31 分类 生活游记 骑你的 白马啊 行你欲行的路 风吹来 花落涂 点一欉香祈求 ---------万千花蕊慈母悲哀从考场出来&#xff0c;剩下的只有无尽极乐 考前准备&#xff1a; 1.电脑充电。 &#xff08;这个赛项需要自带设备&#x…

Kubernetes (K8s) 部署资源的完整配置OceanBase

Kubernetes Deployment 配置&#xff08;oceanbase-deployment.yaml&#xff09; # oceanbase-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: oceanbase-deployment spec:replicas: 1selector:matchLabels:app: oceanbasetemplate:metadata:labels:app…

ACS-电机控制Buffer-任意路径规划(PVSPLINE绘制圆形)

该程序是一个双轴运动&#xff0c;绘制圆形 原始程序&#xff08;可以直接使用&#xff09; GLOBAL INT X1,Y1,ii GLOBAL REAL MY_ARRAY(4)(12) GLOBAL REAL piX1 0; Y1 1 ! Axis assignment pi ACOS(-1) ! Shortcut for generating piii 0 LOOP 12MY_ARRAY(0)(ii) COS(…

MongoDB Change Streams 实时数据变更流处理实战指南

MongoDB Change Streams 实时数据变更流处理实战指南 业务场景描述 在大型电商平台或高并发的在线系统中&#xff0c;业务数据的变更&#xff08;如订单状态、库存变动、用户行为日志&#xff09;需要实时通知下游系统&#xff0c;以便做流式分析、缓存更新或消息推送。传统的轮…

TIME WEAVER: A Conditional Time Series Generation Model论文阅读笔记

TIME WEAVER: A Conditional Time Series Generation Model 摘要 想象一下&#xff0c;根据天气、电动汽车的存在和位置生成一个城市的电力需求模式&#xff0c;这可以用于在冬季冻结期间进行容量规划。这样的真实世界的时间序列通常包含配对的异构上下文元数据&#xff08;天气…

Day 4-2: PyTorch基础入门 - 从NumPy到深度学习的桥梁

Day 4-2: PyTorch基础入门 - 从NumPy到深度学习的桥梁 📚 核心概念(5分钟理解) 一句话定义 PyTorch是Facebook开发的深度学习框架,将NumPy的数组计算能力扩展到GPU,并加入了自动微分功能,让构建和训练神经网络变得简单直观。 为什么重要 GPU加速:比CPU快10-100倍的矩…

法式基因音响品牌SK(SINGKING AUDIO)如何以硬核科技重塑专业音频版图

在专业音响的竞技场&#xff0c;当多数品牌还在功率参数上缠斗时&#xff0c;一个流淌着法兰西血液的品牌——SK&#xff08;SINGKING AUDIO&#xff09;&#xff0c;早已构建起令人仰望的技术巅峰。它完美诠释了真正的声学艺术&#xff1a;不是技术的炫耀&#xff0c;而是让尖…

ZooKeeper学习专栏(五):Java客户端开发(原生API)详解

文章目录前言一、核心类解析1.1 ZooKeeper类 - 连接管理核心1.2 Watcher接口 - 事件处理核心二、原生API实践2.1 创建会话&#xff08;连接管理&#xff09;2.2 创建节点&#xff08;支持多种类型&#xff09;2.3 获取节点数据和状态信息2.4 修改节点数据&#xff08;版本控制&…

卸油管链接检测误报率↓76%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析&#xff0c;核心技术参数与架构设计引用自《陌讯技术白皮书》&#xff0c;禁止未经授权的转载与商用。一、行业痛点&#xff1a;卸油管链接检测的三大技术瓶颈在石化仓储与运输场景中&#xff0c;卸油管链接的密封性检测是保障安全生产的关键环节。…

MongoDB用户认证authSource

文章目录authSource遇到的问题authSource MongoDB用户认证逻辑与以往我认知的关系型数据库逻辑不太一样&#xff0c;多了一层用户与数据库关系的绑定。 在建立用户时&#xff0c;需要先指定数据库&#xff0c;则存在一个概念&#xff1a;用户归属于数据库。额外&#xff0c;依…

插件升级:Chat/Builder 合并,支持自定义 Agent、MCP、Rules

TRAE 插件全新升级&#xff0c;Chat、Builder 合并&#xff0c;支持自定义智能体、MCP 及自定义规则&#xff0c;体验对齐 IDE&#xff0c;现已上线 JetBrains 和 VSCode。 1. Chat/Builder 合并&#xff0c;一个对话框即可智能协作 在 TRAE 插件的 Chat 对话框中&#xff0…

【历史人物】【王安石】简历与生平

目录 一、王安石个人简历 二、个人主要经历 三、个人成就及影响 1、散文 2、诗歌 3、词 四、经典评价摘录 一、王安石个人简历 基本信息‌ 姓名&#xff1a;王安石&#xff0c;字介甫&#xff0c;号半山。小名獾郎 性别&#xff1a;男 年龄&#xff1a;1021年-1086年…

Codeforces Round 1040 (Div. 2) A - D题详细题解

本文为Codeforces Round 1040 (Div. 2) A - D题的详细题解, 觉得有帮助或者写的不错可以点个赞&#xff01; 目录 题目A: 题目大意: 解题思路: 代码(C): 题目B: 题目大意: 解题思路: 代码(C): 题目C: 题目大意: 解题思路: 代码(C): 题目D: 题目大意: 解题思路:…

数据结构 之 【排序】(计数排序)

目录 1.计数排序的思想 2.计数排序图解 3.计数排序代码逻辑 3.1求原数组最大最小值及计数数组的创建 3.2计数 3.3覆盖写 3.4释放资源 4.计数排序的注意事项 5.计数排序的时间复杂度与空间复杂度 以升序为例 1.计数排序的思想 前面我们学习的快排、归并排序、希尔排序.…

Ascend CANN/ACL API 模型部署加速最佳实践

1. 模型输入相关问题 图像尺寸信息 模型输入尺寸由原始模型决定,在转换时固定 图像尺寸信息是模型固有属性,不是转换时添加的 对于使用动态尺寸,可以在推理时自动根据当前的输入尺寸推导输出尺寸。 输入格式(NCHW/NHWC) --input_format 不同框架默认格式不同: Caffe: 支持…