篇四:建造者模式:逐步构造复杂对象

篇四:“建造者模式:逐步构造复杂对象”

设计模式是软件开发中的重要组成部分,建造者模式是创建型设计模式中的一种。建造者模式旨在逐步构造复杂对象,将对象的构造与其表示分离,从而使得同样的构建过程可以创建不同的表示。在C++中,建造者模式广泛应用于构建复杂对象的场景,让我们一起深入了解其核心思想和使用方法,并通过示例代码展示在C++中如何应用建造者模式来构造复杂对象。

开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。

另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d

1. 建造者模式的核心思想和使用方法:
建造者模式是创建型设计模式,其核心思想是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。在建造者模式中,我们定义一个抽象建造者类,用于规范产品的构建过程,并由具体建造者类来实现该接口。然后,使用指挥者类来控制建造过程,最终构建出复杂对象。

建造者模式的使用方法如下:

  1. 定义抽象建造者类:规范产品的构建过程,包括构建部件和组装产品等方法。
  2. 定义具体建造者类:实现抽象建造者接口,负责实际构建产品的过程。
  3. 定义产品类:表示最终构建出的复杂对象。
  4. 定义指挥者类:控制建造过程,根据具体的建造者类来构建产品。

2. C++中应用建造者模式构造复杂对象的示例代码:
在C++中,我们将以创建一个复杂的电脑对象为例来展示建造者模式的应用。

a. 定义抽象建造者类:

// ComputerBuilder.h
class ComputerBuilder {
public:virtual ~ComputerBuilder() {}virtual void buildCPU() = 0;virtual void buildMemory() = 0;virtual void buildStorage() = 0;virtual void buildGPU() = 0;virtual Computer* getResult() = 0;
};

b. 定义具体建造者类:

// HighPerformanceComputerBuilder.h
#include "ComputerBuilder.h"class HighPerformanceComputerBuilder : public ComputerBuilder {
public:HighPerformanceComputerBuilder() {computer_ = new Computer();}void buildCPU() override {computer_->setCPU("High-performance CPU");}void buildMemory() override {computer_->setMemory("16GB");}void buildStorage() override {computer_->setStorage("512GB SSD");}void buildGPU() override {computer_->setGPU("NVIDIA GeForce RTX 3080");}Computer* getResult() override {return computer_;}private:Computer* computer_;
};// StandardComputerBuilder.h
#include "ComputerBuilder.h"class StandardComputerBuilder : public ComputerBuilder {
public:StandardComputerBuilder() {computer_ = new Computer();}void buildCPU() override {computer_->setCPU("Standard CPU");}void buildMemory() override {computer_->setMemory("8GB");}void buildStorage() override {computer_->setStorage("256GB SSD");}void buildGPU() override {computer_->setGPU("Integrated GPU");}Computer* getResult() override {return computer_;}private:Computer* computer_;
};

c. 定义产品类:

// Computer.h
#include <iostream>
#include <string>class Computer {
public:void setCPU(const std::string& cpu) {cpu_ = cpu;}void setMemory(const std::string& memory) {memory_ = memory;}void setStorage(const std::string& storage) {storage_ = storage;}void setGPU(const std::string& gpu) {gpu_ = gpu;}void showInfo() const {std::cout << "CPU: " << cpu_ << std::endl;std::cout << "Memory: " << memory_ << std::endl;std::cout << "Storage: " << storage_ << std::endl;std::cout << "GPU: " << gpu_ << std::endl;}private:std::string cpu_;std::string memory_;std::string storage_;std::string gpu_;
};

d. 定义指挥者类:

// Director.h
#include "ComputerBuilder.h"class Director {
public:void setBuilder(ComputerBuilder* builder) {builder_ = builder;}Computer* construct() {builder_->buildCPU();builder_->buildMemory();builder_->buildStorage();builder_->buildGPU();return builder_->getResult();}private:ComputerBuilder* builder_;
};

e. 使用建造者模式构造复杂对象:

// main.cpp
#include "Computer.h"
#include "Director.h"
#include "HighPerformanceComputerBuilder.h"
#include "StandardComputerBuilder.h"int main() {Director director;HighPerformanceComputerBuilder highPerformanceBuilder;StandardComputerBuilder standardBuilder;// 构建高性能电脑director.setBuilder(&highPerformanceBuilder);Computer* highPerformanceComputer = director.construct();std::cout << "High Performance Computer:" << std::endl;highPerformanceComputer->showInfo();delete highPerformanceComputer;std::cout << std::endl;// 构建标准电脑director.setBuilder(&standardBuilder);Computer* standardComputer = director.construct();std::cout << "Standard Computer:" << std::endl;standardComputer->showInfo();delete standardComputer;return 0;
}

在上述示例中,我们定义了抽象建造者类ComputerBuilder,并创建了两个具体建造者类HighPerformanceComputerBuilderStandardComputerBuilder。产品类Computer表示要构建的复杂对象。指挥者类Director负责控制建造过程,并使用不同的建造者来构建不同的复杂对象。

** 3.建造者模式的代码解析:

  • 在建造者模式中,抽象建造者类ComputerBuilder定义了产品的构建过程,包括构建CPU、内存、存储和GPU等部件,并提供了获取最终产品的方法getResult()。具体建造者类HighPerformanceComputerBuilderStandardComputerBuilder分别实现了抽象建造者接口,负责实际构建高性能电脑和标准电脑的过程。
  • 产品类Computer表示最终构建出的复杂对象,其中包含CPU、内存、存储和GPU等部件,并提供了显示电脑信息的方法showInfo()
  • 指挥者类Director负责控制建造过程,通过setBuilder()方法设置具体的建造者,然后调用其构建方法逐步构造复杂对象。

4. 总结:
建造者模式是创建型设计模式,其核心思想是逐步构造复杂对象,将对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。在C++中,通过定义抽象建造者类和具体建造者类,以及产品类和指挥者类,实现了建造者模式的应用。建造者模式使得构建过程更加灵活和可控,同时提高了代码的可维护性和可复用性。

希望本文能够帮助您更好地理解建造者模式的原理和在C++中的应用。在后续的专栏文章中,我们将继续介绍更多设计模式的知识,包括原理、详细介绍、示例代码和代码解析,帮助您深入学习和应用设计模式。

参考文献:

  • Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
  • C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/

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

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

相关文章

rust怎么生成随机数?

关注我&#xff0c;学习Rust不迷路&#xff01;&#xff01; 在 Rust 中&#xff0c;有几种不同的方法可以实现随机数生成。以下是其中几种常见的方法&#xff0c;以及它们的优缺点&#xff1a; 1. 使用 rand crate&#xff1a; 优点&#xff1a; rand crate 是 Rust 中最常…

【网络基础实战之路】基于MGRE多点协议的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

【GitOps系列】使用 ArgoCD ApplicationSet 来实现多环境管理

文章目录 前言自动多环境管理概述自动化管理多环境实战示例应用简介ApplicationSet 简介部署 ApplicationSet访问多环境 创建新环境实验结语 前言 聊起多环境&#xff0c;通常可能会立即想到下面几个常见的环境&#xff1a; 开发环境测试环境预发布环境生产环境 为了让不同职…

JSP--Java的服务器页面

jsp是什么&#xff1f; jsp的全称是Java server pages,翻译过来就是java的服务器页面。 jsp有什么作用&#xff1f; jsp的主要作用是代替Servlet程序回传html页面的数据&#xff0c;因为Servlet程序回传html页面数据是一件非常繁琐的事情&#xff0c;开发成本和维护成本都非常高…

Apipost三方消息通知,接口变更不用愁

Apipost致力于为开发者提供更全面的API管理功能。而最近&#xff0c;Apipost又新增了一个非常实用的功能&#xff1a;第三方消息推送。这个功能可以帮助开发人员及时了解API的变更情况&#xff0c;从而更好地管理和优化自己的API。 具体来说&#xff0c;Apipost的第三方消息推…

JVM分析工具JProfiler介绍及安装

目录 一、什么是JProfiler&#xff1f; 二、JProfiler 功能结构 1、分析代理 2、记录数据 3、快照 三、安装 一、什么是JProfiler&#xff1f; JProfiler是一个专业的工具&#xff0c;用于分析运行中的JVM内部发生的事情。当您的生产系统出现问题时&#xff0c;您可以…

Postgresql取消正在执行的任务或强制终止正在执行的任务

Postgresql取消正在执行的任务或强制终止正在执行的任务 要停止 PostgreSQL 数据库中当前正在执行的所有任务&#xff0c;可以使用以下方法&#xff1a; 使用 pg_cancel_backend 函数&#xff1a;连接到 PostgreSQL 数据库&#xff0c;并执行以下命令以停止所有正在执行的任务…

【项目 线程3】3.8 线程同步 3.9互斥锁 3.10死锁 3.11读写锁

文章目录 3.8 线程同步3.9互斥锁互斥量互斥量相关操作函数 3.10死锁3.11读写锁读写锁读写锁相关操作函数 3.8 线程同步 问题&#xff1a;卖第0张、第-1张门票&#xff0c;三个线程买同一张门票等等。 原因&#xff1a;三个线程并发执行去抢占线程资源&#xff0c;A进来休眠600…

Redis与其他缓存解决方案(如Memcached)的区别是什么?

Redis和其他缓存解决方案&#xff08;如Memcached&#xff09;在设计理念、功能和特点上有一些区别&#xff0c;以下是它们的主要区别&#xff1a; 数据类型支持&#xff1a;Redis支持多种数据类型&#xff08;如字符串、哈希表、列表、集合、有序集合等&#xff09;&#xff0…

【JavaEE初阶】了解JVM

文章目录 一. JVM内存区域划分二. JVM类加载机制2.1 类加载整体流程2.2 类加载的时机2.3 双亲委派模型(经典) 三. JVM垃圾回收机制(GC)3.1 GC实际工作过程3.1.1 找到垃圾/判定垃圾1. 引用计数(不是java的做法,Python/PHP)2. 可达性分析(Java的做法) 3.1.2 清理垃圾1. 标记清除2…

数据结构——单链表OJ题

单链表OJ题 前言一、删除链表中等于给定值 val 的所有节点二、反转一个单链表三、返回链表的中间结点四、输出该链表中倒数第k个结点五、将两个有序链表合并六、链表的回文结构七、将链表分割成两部分八、找出第一个公共结点九、判断链表中是否有环总结 前言 在前面的博客中我…

jenkins的cicd操作

cicd概念 持续集成&#xff08; Continuous Integration&#xff09; 持续频繁的&#xff08;每天多次&#xff09;将本地代码“集成”到主干分支&#xff0c;并保证主干分支可用 持续交付&#xff08;Continuous Delivery&#xff09; 是持续集成的下一步&#xff0c;持续…

智能优化算法——哈里鹰算法(Matlab实现)

目录 1 算法简介 2 算法数学模型 2.1.全局探索阶段 2.2 过渡阶段 2.3.局部开采阶段 3 求解步骤与程序框图 3.1 步骤 3.2 程序框图 4 matlab代码及结果 4.1 代码 4.2 结果 1 算法简介 哈里斯鹰算法(Harris Hawks Optimization&#xff0c;HHO)&#xff0c;是由Ali As…

高并发与性能优化的神奇之旅

作为公司的架构师或者程序员&#xff0c;你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢&#xff1f;笔者在出道那会为此是吃尽了苦头的&#xff0c;不过也得感谢这段苦&#xff0c;让笔者从头到尾去探索&#xff0c;找寻解决之法。 目录 第一站…

Docker部署Gitlab

Docker部署Gitlab 文章目录 Docker部署Gitlab前置环境部署步骤初始化配置文件80端口部署方式&#xff08;二选一&#xff09;非80端口需要的部署方式&#xff08;二选一&#xff09;修改 gitlab.rb修改 gitlab.yml刷新配置 前置环境 docker 19.03.13 es 7.2.0 部署步骤 初始…

android AIDL 学习使用

在android studio 2023.2中使用 1、在buidl.gradle增加以下配置&#xff0c;然后同步。不增加这些配置&#xff0c;创建aidl时显示为灰色&#xff0c;不能创建 buildFeatures {compose true// Disable unused AGP featuresbuildConfig falseaidl truerenderScript falseresVal…

Flink学习教程

最近因为用到了Flink&#xff0c;所以博主开了《Flink教程》专栏来记录Flink的学习笔记。 【Apache Flink v1.16 中文文档】 【官网 - Apache Flink v1.3 中文文档】 一、基础 参考链接如下&#xff1a; Flink教程&#xff08;01&#xff09;- Flink知识图谱Flink教程&…

使用即时消息缩短 B2B 销售周期

在B2B销售中&#xff0c;时间就是一切。所以企业需要做的就是尽可能快地回复客户的咨询&#xff0c;否则会造成严重的客户流失。什么是 B2B 销售&#xff1f;它就是企业对企业销售&#xff0c;企业主要或仅向其他企业销售其产品或服务&#xff0c;这些产品或服务可以是从软件到…

安卓:BottomNavigationBar——底部导航栏控件

目录 一、BottomNavigationBar介绍 二、BottomNavigationBar的常用方法及其常用类 &#xff08;一&#xff09;、常用方法 1. 添加菜单项 2. 移除菜单项 3. 设置选中监听器 4. 设置当前选中项 5. 设置徽章 6. 样式和颜色定制 7. 动画效果 8. 隐藏底部导航栏。 9、设…

C# Blazor 学习笔记(10):依赖注入

文章目录 前言Blazor 依赖注入依赖注入用于解决什么问题&#xff1f;依赖注入的生命周期。测试代码 总结补充日期2023年8月4日 前言 Blazor 具有前后端不分离模式&#xff0c;但是如何直接调用需要一定的设置 Blazor 依赖注入 依赖注入在spring里面很常见&#xff0c;毕竟.N…