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

应用Builder模式在C++中进行复杂对象构建

引言

在软件开发中,构建复杂对象时常常会遇到构造函数或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. 脑图展示

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

+-------------------+
|     Director     |
+-------------------+
| - guoyao: GuoyaoBuilder |
| + construct(): YongYong |
+-------------------+||
+-------------------+
|   GuoyaoBuilder   |
+-------------------+
| - yongYong: YongYong |
| + buildBowlOfRice() |
| + buildPower()     |
| + buildCustomer()  |
| + buildSoldier()   |
| + getResult(): YongYong |
+-------------------+||
+-------------------+
|     YongYong     |
+-------------------+
| - bowlOfRice: BowlOfRice |
| - power: Power          |
| - customer: Customer    |
| - soldier: Soldier      |
| + work()               |
+-------------------+||
+-------------------+
|  BowlOfRice      |
+-------------------+
| + eat()           |
+-------------------+||
+-------------------+
|    Power         |
+-------------------+
| + exercise()     |
+-------------------+||
+-------------------+
|    Customer       |
+-------------------+
| + request()       |
+-------------------+||
+-------------------+
|    Soldier       |
+-------------------+
| + obey()          |
+-------------------+

7. 总结

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

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

8. 参考资料

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

相关文章:

  • Vue与Ajax快速入门
  • GXP6040K压力传感器可应用于医疗/汽车/家电
  • Python Flask框架Web应用开发完全教程
  • 【stm32】GPIO
  • 第3章 AB实验的统计学知识
  • 从Web2.0到Web3.0:社交参与方式的重塑与延伸
  • 报错[Vue warn]: Failed to resolve directive: else如何解决?
  • Linux9 root密码修改
  • 数据结构第5问:什么是队列?
  • 【科普】怎么理解Modbus、TCP、UDP
  • C++入门自学Day4-- c++类与对象(友元)
  • 《软件测试与质量控制》实验报告一 测试用例设计
  • 新一代PLC控制软件平台EsDA-AWStudio
  • Linux文件系统理解2
  • Python爬虫库性能与选型实战指南:从需求到落地的全链路解析
  • PendingIntent的flag和原理解析
  • 如何使用淘宝开放平台API获取商品详细信息?
  • Docker设置容器时间
  • 通过pendingIntent启动activity被block问题
  • 网站QPS多少才算高并发
  • TOGAF指南1
  • Effective C++ 条款16: 成对使用new和delete时要采用相同形式
  • pycharm快捷键设置为和vscode一样
  • 数据仓库、数据湖与湖仓一体技术笔记
  • 高防服务器租用:保障数据安全
  • 自建rustdesk服务器过程记录
  • 【代码】印章提取红色部分
  • 观测云基于 ToB/ToC 业务可观测最佳实践
  • Android ConstraintLayout 使用详解
  • A 常见图形API和图形渲染引擎介绍