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

【C++设计模式之建造者模式:创建型】分析及示例

简介

建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

描述

建造者模式通过将一个复杂对象的构建过程拆分成多个简单的部分,并由不同的建造者构建每个部分,最终组装成整的对象。这种方式可以灵活地构建不同的对象表示,同时封装了对象的构建过程。

原理

建造者模式的核心思想是将一个复杂对象的构建过程与其表示分离。通常,一个建造者接口定义了构建每个部分的方法,一个具体的建造者实现了该接口,并负责构建每个部分。最后,一个指挥者类根据具体的构建者来组装构建过程,并返回构建完成的对象。

类图

在这里插入图片描述
建造者模式中有几个角色:

  1. Director:导演类,按照已有的顺序告诉Builder建造
  2. Builder:抽象建造者,规范建造的方法
  3. ConcreteBuilder:具体的建造者,复实现抽象建造者的方法,并返回一个产品
  4. Product:产品类

示例

假设要构建一个电脑对象,该电脑对象包含CPU、内存和硬盘等部件。

  1. 创建一个电脑建造者接口(ComputerBuilder),其中定义了构建每个部分的方法。
  2. 创建了具体的电脑建造者类(ConcreteComputerBuilder),实现了建造者接口,并负责构建每个部分。
  3. 创建一个指挥者类(Director),根据具体的建造者来组装构建过程,并最终返回构建好的电脑对象。

C++示例代码如下:

#include <iostream>
using namespace std;// 电脑类
class Computer {
public:void setCPU(const string& cpu) {this->cpu cpu;}void setMemory(const string& memory) {this->memory = memory;}void setHardDrive(const string& hardDrive) {this->hardDrive = hardDrive;}void showInfo() const {cout << "CPU: " << cpu << endl;cout << "Memory: " << memory << endl;cout << "Hard Drive: " << hardDrive << endl;}
private:string cpu;string memory;string hardDrive;
};// 电脑建造者接口
class ComputerBuilder {
public:virtual void buildCPU() = 0;virtual void buildMemory() = 0;virtual void buildHardDrive() = 0;virtual Computer* get() = 0;
};// 具体的电脑建造者
class ConcreteComputerBuilder : public ComputerBuilder {
public:ConcreteComputerBuilder() {computer = new Computer();}void buildCPU() override {computer->setCPU("Intel Core i7");}void buildMemory() override {computer->setMemory("16GB");}void buildHardDrive() override {computer->setHardDrive("1TB SSD");}Computer* getComputer() override {return computer;}private:Computer* computer;
};// 指挥者
class Director {
public:void setComputerBuilder(ComputerBuilder* builder){this->builder = builder;}void constructComputer() {builder->buildCPU();builder->buildMemory();builder->buildHardDrive();}private:ComputerBuilder* builder;
};// 使用示例
int main() {Director director;ConcreteComputerBuilder builder;director.setComputerBuilder(&builder);director.constructComputer();Computer* computer = builder.getComputer();computer->showInfo();delete computer;return 0;
}

输出结果

CPU: Intel Core i7
Memory: 16GB
Hard Drive: 1TB SSD

解释

在上述示例中,首先定义了电脑类(Computer),其中包含了一些电脑的属性和显示信息的方法。
然后,创建了电脑建造者接口(ComputerBuilder),其中定义了构建每个部分的抽象方法,并定义了获取构建好的电脑的方法。
接着,创建了具体的电脑建造者类(ConcreteComputerBuilder),它实现了电脑建造者接口,并负责构建每个部分。
最后,创建了一个指挥者类(Director),它接收一个具体的建造者,并根据这个建造者来组装建过程。

在示例中,通过调用指挥者的constructComputer方法来使用具体的建造者构建电脑对象。最终,通过调用建造者的getComputer方法来获取构建好电脑对象,并调用它的showInfo方法来显示电脑的信息。

结论

建造者模式通过将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它提供了更加灵活和可复用的方式来构建复杂对象。

应用场景

建造者模式适用于以下情况:

  1. 当需要创建具有复杂内部结构的对象时,使用建造者模式可以简化构建过程;
  2. 当需要构建的对象具有不同的表示时,使用建造者模式可以根据不同的建造者生成不同的对象表示;
  3. 当需要封装对象的构建过程,以便于修改或扩展时,使用建造者模式可以将构建过程与表示分离,减少代码的耦合度。

建造者模式可以应用于各种场景,如复杂对象的构建、流程控制、组装不同的表示等。它通过将构建过程拆分为多个简单的部分,使得构建过程可控制和可扩,提供了更加灵活和可复用对象构建方式。

相关文章:

【C++设计模式之建造者模式:创建型】分析及示例

简介 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 描述 建造者模式通过将一个复杂对象的构建过程拆分成多个简单的部分&#xff0c;并由不同…...

C++day03(动态内存、类中特殊成员函数)

今日任务 1> 思维导图 2> 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 代码&#xff1a; …...

【Leetcode】179. 最大数

一、题目 1、题目描述 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 示例1: 输入:nums = [10,2] 输出:"210"示例2: 输入:nums = [3,30,34,5…...

ArduPilot开源飞控之AP_Baro_MSP

ArduPilot开源飞控之AP_Baro_MSP 1. 源由2. back-end抽象类3. 方法实现3.1 AP_Baro_MSP3.2 update3.3 handle_msp3.4 MSP UART port 4. 参考资料 1. 源由 鉴于ArduPilot开源飞控之AP_Baro中涉及Sensor Driver有以下总线类型&#xff1a; I2CSerial UARTCANSITL //模拟传感器(…...

openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw

文章目录 openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw94.1 编译mysql_fdw94.2 使用mysql_fdw94.3 常见问题94.4 注意事项 openGauss学习笔记-94 openGauss 数据库管理-访问外部数据库-mysql_fdw openGauss的fdw实现的功能是各个openGauss数据库及远程…...

UML图 - 类图(Class Diagram)

类图是描述系统中的类&#xff0c;以及各个类之间的关系的静态视图。能够让我们在正确编写代码以前对系统有一个全面的认识。类图是一种模型类型&#xff0c;确切的说&#xff0c;是一种静态模型类型。类图表示类、接口和它们之间的协作关系。 类图的结构 类一般由三部分组成&…...

sheng的学习笔记-【中文】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第二周测验

课程2_第2周_测验题 目录&#xff1a;目录 第一题 1.当输入从第8个mini-batch的第7个的例子的时候&#xff0c;你会用哪种符号表示第3层的激活&#xff1f; A. 【  】 a [ 3 ] { 8 } ( 7 ) a^{[3]\{8\}(7)} a[3]{8}(7) B. 【  】 a [ 8 ] { 7 } ( 3 ) a^{[8]\{7\}(3)} a…...

Nacos 监控手册

Nacos 0.8.0版本完善了监控系统&#xff0c;支持通过暴露metrics数据接入第三方监控系统监控Nacos运行状态&#xff0c;目前支持prometheus、elastic search和influxdb&#xff0c;下面结合prometheus和grafana如何监控Nacos。与elastic search和influxdb结合可自己查找相关资料…...

项目需求分析5大常见问题及解决方案

需求分析过程中&#xff0c;往往容易导致需求不准确和不完整&#xff0c;引起需求频繁变更&#xff0c;导致项目进度延误和成本增加&#xff1b;而需求分析的误解问题&#xff0c;导致交付产品无法满足客户期待&#xff0c;降低用户满意度和资源浪费。 那么在需求分析中&#x…...

C#学习系列相关之多线程(四)----async和await的用法

一、async、await用法的作用 async用法主要是用来作为修饰符将方法作为异步方法使用&#xff0c;await关键字只用作为在异步方法才能使用&#xff0c;也就是只有当方法有async修饰后&#xff0c;才能在方法中使用await&#xff0c;await后跟Task新的任务启动。&#xff08;awai…...

极智AI | 大模型优化之KV Cache

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 大模型优化之KV Cache。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 在大模型的优化中经常会听到的一个技术叫…...

Android 使用 registerForActivityResult() 打开系统相册或相机获取图像

一、简介 当使用了 AndroidX 后&#xff0c;发现 startActivityForResult() 标记为过时了&#xff0c;而是推荐我们使用 registerForActivityResult() 函数。 registerForActivityResult() 函数是 Android 中用于启动 Activity 结果回调的新方式。这个函数的目的是简化在 Act…...

如何制作网页 ico

1. 制作 icon 可以通过 https://www.iconfont.cn/collections/detail?spma313x.7781069.1998910419.de12df413&cid13720 或者自己在 PPT 制作&#xff0c;然后截图导出png 文件。 2. 转换为 ico 文件 使用&#xff1a;https://www.bitbug.net/ 上传并且转换成自己要的…...

golang gorm 增删改查以及使用原生SQL(以操作mysql为例)

gorm mysql增删改查 model定义 package _caseimport "gorm.io/gorm"func init() {DB.Migrator().AutoMigrate(Teacher{}, Course{}) } type Roles []stringtype Teacher struct {gorm.ModelName string gorm:"size:256"Email string gorm:&q…...

代码随想录 单调栈part2

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…...

详解利用高斯混合模型拆解多模态分布 + 精美可视化

文章目录 一、前言二、主要内容三、总结🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 本文旨在介绍如何利用高斯混合模型(Gaussian Mixture Models,简称 GMMs)将一维多模态分布拆分为多个分布。作为统计 / / /机器学习领域常用的概率模型...

排序算法之【归并排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…...

Qt中QTimer定时器的用法

Qt中提供了两种定时器的方式一种是使用Qt中的事件处理函数&#xff0c;另一种就是Qt中的定时器类QTimer。 使用QTimer类&#xff0c;需要创建一个QTimer类对象&#xff0c;然后调用其start()方法开启定时器&#xff0c;此后QTimer对象就会周期性的发出timeout()信号。 1.QTimer…...

vue-组件定义注册使用

vue组件使用的步骤 定义组件注册组件使用组件 定义组件 Vue.extend(options) 其中options和new Vue(options)出入的options对象几乎一样&#xff0c;但是也有不同。 创建 el不用写—最终所有组件需要经过一个vm的管理&#xff0c;由vm的el决定服务哪个容器。 data必须写成函…...

斑馬打印機打印中文

创建项目 首先說一下&#xff0c;本文章是借鉴了其他大佬的文章&#xff0c;然后我记录一下的文章。 首先创建好一个.net framework的winform项目。 这里面主要用到两个库文件&#xff1a; Fnthex32.dll、LabelPrint.dll。 Fnthex32这个有8位参数和9位参数的&#xff0c;我这…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)

零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...

[特殊字符] Spring Boot底层原理深度解析与高级面试题精析

一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配&#xff0c;通过简化传统Spring应用的初始化和配置流程&#xff0c;显著提升开发效率。其底层原理可拆解为以下核心机制&#xff1a; 自动装配&#xff08;Auto-Configuration&#xff09; 核…...

解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法

目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客&#xff1a;【写在创作纪念日】基于SpringBoot和PostG…...