篇四:建造者模式:逐步构造复杂对象
篇四:“建造者模式:逐步构造复杂对象”
设计模式是软件开发中的重要组成部分,建造者模式是创建型设计模式中的一种。建造者模式旨在逐步构造复杂对象,将对象的构造与其表示分离,从而使得同样的构建过程可以创建不同的表示。在C++中,建造者模式广泛应用于构建复杂对象的场景,让我们一起深入了解其核心思想和使用方法,并通过示例代码展示在C++中如何应用建造者模式来构造复杂对象。
开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。
另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d
1. 建造者模式的核心思想和使用方法:
建造者模式是创建型设计模式,其核心思想是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。在建造者模式中,我们定义一个抽象建造者类,用于规范产品的构建过程,并由具体建造者类来实现该接口。然后,使用指挥者类来控制建造过程,最终构建出复杂对象。
建造者模式的使用方法如下:
- 定义抽象建造者类:规范产品的构建过程,包括构建部件和组装产品等方法。
- 定义具体建造者类:实现抽象建造者接口,负责实际构建产品的过程。
- 定义产品类:表示最终构建出的复杂对象。
- 定义指挥者类:控制建造过程,根据具体的建造者类来构建产品。
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
,并创建了两个具体建造者类HighPerformanceComputerBuilder
和StandardComputerBuilder
。产品类Computer
表示要构建的复杂对象。指挥者类Director
负责控制建造过程,并使用不同的建造者来构建不同的复杂对象。
** 3.建造者模式的代码解析:
- 在建造者模式中,抽象建造者类
ComputerBuilder
定义了产品的构建过程,包括构建CPU、内存、存储和GPU等部件,并提供了获取最终产品的方法getResult()
。具体建造者类HighPerformanceComputerBuilder
和StandardComputerBuilder
分别实现了抽象建造者接口,负责实际构建高性能电脑和标准电脑的过程。 - 产品类
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/
相关文章:
篇四:建造者模式:逐步构造复杂对象
篇四:“建造者模式:逐步构造复杂对象” 设计模式是软件开发中的重要组成部分,建造者模式是创建型设计模式中的一种。建造者模式旨在逐步构造复杂对象,将对象的构造与其表示分离,从而使得同样的构建过程可以创建不同的…...

vs导出和导入动态库和静态库
1. 动态库和导出和导入 1.1 动态库的导出 1. 创建新项目 新建新项目,选择动态链接库(DLL)。 填写项目名称,并选择项目保存的路径,然后点击创建。 创建完成后,会自动生成如下所示文件,可以根据…...
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之后的续讲, 由于在上一篇讲的排序的基本…...

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

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

解决Hadoop审计日志hdfs-audit.log过大的问题
【背景】 新搭建的Hadoop环境没怎么用,就一个环境天天空跑,结果今天运维告诉我说有一台服务器磁盘超过80%了,真是太奇怪了,平台上就跑了几个spark测试程序,哪来的数据呢? 【问题调查】 既然是磁盘写满了&…...
【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…...

【深度学习】采用自动编码器生成新图像
一、说明 你知道什么会很酷吗?如果我们不需要所有这些标记的数据来训练 我们的模型。我的意思是标记和分类数据需要太多的工作。 不幸的是,大多数现有模型从支持向量机到卷积神经网,没有它们,卷积神经网络就无法训练。无监督学习不…...

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

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

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的开发要点总结(4) 文章目录 【JavaEE】Spring的开发要点总结(4)1. Bean的作用域1.1 一个例子感受作用域的存在1.2 通过例子说明作用域的定义1.3 六种不同的作用域1.3.1 singleton单例模式(默认作用域…...
P1320 压缩技术(续集版)
题目描述 设某汉字由 N N N \times N NN 的 0 \texttt 0 0 和 1 \texttt 1 1 的点阵图案组成。 我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有…...

k8s(七) 叩丁狼 service Ingress
负责东西流量(同层级/内部服务网络通信)的通信 service的定义 apiVersion: v1 kind: Service metadata:name: nginx-svclabels:app: nginx-svc spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议,支持 TCP、…...

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

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

代码分析:循环创建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如何解决跨域问题?2.为什么要用Spring Boot?3. Spring Boot的约定优于配置,你的理解是什么?4. SpringBoot有哪些优点?5. Spring Boot中自动装配机制的原理?6.SpringBoot支持哪些日志框…...

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

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...