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

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

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

设计模式是软件开发中的重要组成部分,建造者模式是创建型设计模式中的一种。建造者模式旨在逐步构造复杂对象,将对象的构造与其表示分离,从而使得同样的构建过程可以创建不同的表示。在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/

相关文章:

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

篇四&#xff1a;“建造者模式&#xff1a;逐步构造复杂对象” 设计模式是软件开发中的重要组成部分&#xff0c;建造者模式是创建型设计模式中的一种。建造者模式旨在逐步构造复杂对象&#xff0c;将对象的构造与其表示分离&#xff0c;从而使得同样的构建过程可以创建不同的…...

vs导出和导入动态库和静态库

1. 动态库和导出和导入 1.1 动态库的导出 1. 创建新项目 新建新项目&#xff0c;选择动态链接库&#xff08;DLL&#xff09;。 填写项目名称&#xff0c;并选择项目保存的路径&#xff0c;然后点击创建。 创建完成后&#xff0c;会自动生成如下所示文件&#xff0c;可以根据…...

30 使用easyExcel依赖生成Excel

30.1 导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId&…...

排序进行曲-v2.0

文章目录 小程一言直接插入排序步骤举例复杂度分析应用场景实际举例代码实现 希尔排序步骤举例复杂度分析应用场景实际举例代码实现 堆排序步骤举例复杂度分析应用场景实际举例代码实现 小程一言 这篇文章是在排序进行曲1.0之后的续讲&#xff0c; 由于在上一篇讲的排序的基本…...

反弹shell的N种姿势

预备知识1. 关于反弹shell 就是控制端监听在某TCP/UDP端口&#xff0c;被控端发起请求到该端口&#xff0c;并将其命令行的输入输出转到控制端。reverse shell与telnet&#xff0c;ssh等标准shell对应&#xff0c;本质上是网络概念的客户端与服务端的角色反转。2. 反弹shel…...

创意视频剪辑教程:快速合并视频并标题,让你的作品更吸睛!

想要让你的视频作品脱颖而出&#xff0c;引人注目&#xff1f;不再担心&#xff0c;我们为你带来了一款创意视频剪辑教程&#xff0c;教你如何快速合并视频并添加令人惊艳的标题效果&#xff01;让你的作品在分钟内变得酷炫而精彩&#xff0c;向世界展示你的创意&#xff01; …...

解决Hadoop审计日志hdfs-audit.log过大的问题

【背景】 新搭建的Hadoop环境没怎么用&#xff0c;就一个环境天天空跑&#xff0c;结果今天运维告诉我说有一台服务器磁盘超过80%了&#xff0c;真是太奇怪了&#xff0c;平台上就跑了几个spark测试程序&#xff0c;哪来的数据呢&#xff1f; 【问题调查】 既然是磁盘写满了&…...

【Java】java和kotlin关于Json写文件

Java写json文件 public class WriterJson {public static void main(String[] args) {// 创建一个 JSON 对象JSONObject jsonObject new JSONObject();jsonObject.put("case", "testtest");JSONObject jsonObjects new JSONObject();jsonObjects.put(&q…...

【深度学习】采用自动编码器生成新图像

一、说明 你知道什么会很酷吗&#xff1f;如果我们不需要所有这些标记的数据来训练 我们的模型。我的意思是标记和分类数据需要太多的工作。 不幸的是&#xff0c;大多数现有模型从支持向量机到卷积神经网&#xff0c;没有它们&#xff0c;卷积神经网络就无法训练。无监督学习不…...

华为云交付

文章目录 一、华为云-公有云架构华为公有云的主要服务1.华为云服务—计算类2.华为云服务——存储类3.华为云服务—网络类4.华为云服务—管理和监督类5.华为云数据库 二、待续 一、华为云-公有云架构 华为公有云的主要服务 ECS&#xff1a;弹性云服务器&#xff08; Elastic Cl…...

dns瞅一瞅

正向解析—域名到ip 反向解析–ip到域名 域名本身是从又往左来解释的 根域—最顶层的域&#xff0c;用null字符标识&#xff0c;通常会省略最后的点和null字符&#xff0c;但是应用程序会在解析dns之前添加这些字符 顶级域— 两种类型&#xff0c;一种国家、地区代码的顶级域…...

springAOP的实例

文章目录 前言一.用户登录权限校验1.1 spring 拦截器1.2 传统的用户登录权限验证1.3 使用拦截器的方式1.4 案例1.5 拦截器实现原理 三.统一异常处理3.1 什么是统一异常处理3.2 具体步骤 四.统⼀数据返回格式4.1 为什么需要统一的数据返回4.2 统一返回数据的格式4.3 统一移除处理…...

【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)

【JavaEE】Spring的开发要点总结&#xff08;4&#xff09; 文章目录 【JavaEE】Spring的开发要点总结&#xff08;4&#xff09;1. Bean的作用域1.1 一个例子感受作用域的存在1.2 通过例子说明作用域的定义1.3 六种不同的作用域1.3.1 singleton单例模式&#xff08;默认作用域…...

P1320 压缩技术(续集版)

题目描述 设某汉字由 N N N \times N NN 的 0 \texttt 0 0 和 1 \texttt 1 1 的点阵图案组成。 我们依照以下规则生成压缩码。连续一组数值&#xff1a;从汉字点阵图案的第一行第一个符号开始计算&#xff0c;按书写顺序从左到右&#xff0c;由上至下。第一个数表示连续有…...

k8s(七) 叩丁狼 service Ingress

负责东西流量&#xff08;同层级/内部服务网络通信&#xff09;的通信 service的定义 apiVersion: v1 kind: Service metadata:name: nginx-svclabels:app: nginx-svc spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议&#xff0c;支持 TCP、…...

Android Studio 关于BottomNavigationView 无法预览视图我的解决办法

一、前言&#xff1a;最近在尝试一步一步开发一个自己的软件&#xff0c;刚开始遇到的问题就是当我们引用 com.google.android.material.bottomnavigation.BottomNavigationView出现了无法预览视图的现象&#xff0c;我也在网上查了很多中解决方法&#xff0c;最后在执行了如下…...

【STM32】小电流FOC驱控一体板(开源)

FOC驱控一体板 主控芯片stm32f103c8t6 驱动芯片drv8313 三相电流采样 根据B站一个UP主的改的&#xff08;【【自制】年轻人的第一块FOC驱动器】&#xff09;&#xff0c;大多数元器件是0805&#xff0c;实验室具备且便于自己动手焊接 。 晶振用的是无源晶振&#xff0c;体…...

代码分析:循环创建N个子进程——为什么最后一个属于父进程?

黑马C/C 2018年32期代码分析 //循环创建n个子进程 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h>int main() {int i 0;for(i0; i<3; i){//创建子进程pid_t pid fork();if(pid&…...

【SpringBoot面试题整理-超级有效】

文章目录 1.SpringBoot如何解决跨域问题&#xff1f;2.为什么要用Spring Boot&#xff1f;3. Spring Boot的约定优于配置&#xff0c;你的理解是什么&#xff1f;4. SpringBoot有哪些优点&#xff1f;5. Spring Boot中自动装配机制的原理&#xff1f;6.SpringBoot支持哪些日志框…...

岩土工程仪器多通道振弦传感器信号转换器应用于隧道安全监测

岩土工程仪器多通道振弦传感器信号转换器应用于隧道安全监测 多通道振弦传感器信号转换器VTI104_DIN 是轨道安装式振弦传感器信号转换器&#xff0c;可将振弦、温度传感器信号转换为 RS485 数字信号和模拟信号输出&#xff0c;方便的接入已有监测系统。 传感器状态 专用指示灯方…...

西瓜书读书笔记整理(五)—— 第四章 决策树

第四章 决策树 4.1 基本流程4.1.1 什么是决策树算法4.1.2 决策树学习的目的4.1.3 决策树学习基本过程4.1.4 决策树学习基本算法4.1.5 递归结束的三种情况 4.2 划分选择4.2.1 信息增益&#xff08;information gain&#xff09;—— ID3 决策树学习算法属性划分准则4.2.2 信息增…...

STM32 4G学习

硬件连接 ATK-IDM750C模块可直接与正点原子 MiniSTM32F103开发板板载的ATK模块接口&#xff08;ATK-MODULE&#xff09;进行连接。 功能说明 ATK-IDM750C是正点原子&#xff08;ALIENTEK&#xff09;团队开发的一款高性能4G Cat1 DTU产品&#xff0c;支持移动4G、联通4G和…...

Golang 中实现实时聊天通讯

客户端代码 package mainimport ("fmt""log""net/url""os""os/signal""time""github.com/gorilla/websocket" )func main() {interrupt : make(chan os.Signal, 1)signal.Notify(interrupt, os.Interr…...

前端面试的性能优化部分(5)每天10个小知识点

目录 系列文章目录前端面试的性能优化部分&#xff08;1&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;2&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;3&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;4&#xff09;每天…...

【链表OJ 1】移除链表元素val

大家好&#xff0c;欢迎来到我的博客&#xff0c;此题是关于链表oj的第一题&#xff0c;此后还会陆续更新博客&#xff0c;如有错误&#xff0c;欢迎大家指正。 来源:https://leetcode.cn/problems/remove-linked-list-elements/description/ 题目: 方法一:定义prev和cur指针…...

复原 IP 地址——力扣93

文章目录 题目描述回溯题目描述 回溯 class Solution{public:static constexpr int seg_count=4<...

OSPF综合实验

实验题目如下&#xff1a; 实验拓扑如下&#xff1a; 实验要求如下&#xff1a; 【1】R4为ISP&#xff0c;其上只能配置IP地址: R4与其他所有直连设备间使用公有 【2】R3---R5/6/7为MGRE环境&#xff0c;R3为中心站点 【3】整个OSPF环境IP地址为172.16.0.0/16 【4】所有设备…...

安卓4G核心板开发板_MTK6785/MT6785(Helio G95)安卓手机主板方案

联发科MTK6785&#xff08;Helio G95&#xff09;安卓核心板采用八核 CPU 具有两个强大的 Arm Cortex-A76 处理器内核&#xff0c;主频高达 2.05GHz&#xff0c;外加六个 Cortex-A55 高效处理器。其强大的图形性能由 Arm Mali-G76 MC4 提供&#xff0c;速度可提升至 900MHz 。 …...

Linux 匿名页的生命周期

目录 匿名页的生成 匿名页生成时的状态 do_anonymous_page缺页中断源码 从匿名页加入Inactive lru引出 一个非常重要内核patch 匿名页何时回收 本文以Linux5.9源码讲述 匿名页的生成 用户空间malloc/mmap(非映射文件时&#xff09;来分配内存&#xff0c;在内核空间发生…...

设计模式概述与UML图

文章目录 一、设计模式概述1. 软件设计模式的产生背景2. 软件设计模式的概念3. 学习设计模式的必要性4. 设计模式分类&#xff08;1&#xff09;创建型模式&#xff08;2&#xff09;结构型模式&#xff08;3&#xff09;行为型模式 二、UML图1. 类图概述2. 类图作用3. 类图表示…...