设计模式--建造者模式
建造者模式是一种创建型设计模式,它允许用户通过一步一步地构建对象来创建复杂的对象。这种模式在许多应用场景中非常有用,例如在创建具有多个可选参数的对象、构建具有多种配置的对象以及生成具有多个部分的对象时。
应用场景
- 创建具有多个可选参数的对象:当需要创建一个对象,该对象有多个可选参数,并且这些参数的组合很复杂时,可以使用建造者模式来简化对象的创建过程。
- 构建具有多种配置的对象:当需要创建一个对象,该对象有多种配置,每种配置都有不同的参数组合时,可以使用建造者模式来管理这些配置。
- 生成具有多个部分的对象:当需要创建一个由多个部分组成的大型对象时,可以使用建造者模式来逐步构建这些部分,从而简化创建过程。
使用技巧与注意事项
- 清晰定义建造者接口:建造者接口应该定义清楚,使得客户端可以轻松地使用建造者来构建对象。
- 保持建造者的一致性:建造者应该保持一致的行为,确保每次构建出来的对象都是有效的。
- 避免滥用:如果对象的创建过程很简单,可能不需要使用建造者模式,直接实例化对象即可。
C++代码示例
下面是一个使用C++编写的建造者模式示例代码:
#include <iostream>
#include <string>
// 产品类
class Car {
private:std::string engine;std::string transmission;int wheels;
public:Car(std::string engine, std::string transmission, int wheels) {this->engine = engine;this->transmission = transmission;this->wheels = wheels;}void display() {std::cout << "Engine: " << engine << std::endl;std::cout << "Transmission: " << transmission << std::endl;std::cout << "Wheels: " << wheels << std::endl;}
};
// 建造者类
class CarBuilder {
public:virtual void setEngine(std::string engine) = 0;virtual void setTransmission(std::string transmission) = 0;virtual void setWheels(int wheels) = 0;virtual Car* getCar() = 0;
};
// 具体建造者类
class SportsCarBuilder : public CarBuilder {
private:std::string engine;std::string transmission;int wheels;
public:void setEngine(std::string engine) override {this->engine = engine;}void setTransmission(std::string transmission) override {this->transmission = transmission;}void setWheels(int wheels) override {this->wheels = wheels;}Car* getCar() override {return new Car(engine, transmission, wheels);}
};
// 导演类
class Director {
private:CarBuilder* builder;
public:void setBuilder(CarBuilder* builder) {this->builder = builder;}Car* constructCar() {builder->setEngine("V8");builder->setTransmission("Manual");builder->setWheels(4);return builder->getCar();}
};
int main() {Director director;SportsCarBuilder sportsCarBuilder;director.setBuilder(&sportsCarBuilder);Car* sportsCar = director.constructCar();sportsCar->display();delete sportsCar;return 0;
}
在这个示例中,我们定义了一个产品类 Car
,它有发动机、变速箱和车轮等属性。建造者类 CarBuilder
定义了设置这些属性的接口,具体建造者类 SportsCarBuilder
实现了这些接口。导演类 Director
负责使用建造者来构建对象。客户端代码只需要与导演类交互,而不需要知道具体建造者的实现。
通过这个示例,我们可以看到建造者模式在C++中的实现。总之,建造者模式是一种非常有用的设计模式,它可以帮助我们简化复杂对象的创建过程,提高代码的灵活性和可维护性。在实际开发中,我们需要根据具体的应用场景来选择是否使用建造者模式,并注意相关的使用技巧和注意事项。
相关文章:
设计模式--建造者模式
建造者模式是一种创建型设计模式,它允许用户通过一步一步地构建对象来创建复杂的对象。这种模式在许多应用场景中非常有用,例如在创建具有多个可选参数的对象、构建具有多种配置的对象以及生成具有多个部分的对象时。 应用场景 创建具有多个可选参数的…...
运行时间比较
subprocess.run() 函数参数的含义: shell_command:这是要执行的命令。它可以是一个字符串,也可以是一个包含命令和参数的列表。例如,“ls -l” 或 [“ls”, “-l”]。shellTrue:这是一个布尔值参数,指示是…...

【系统架构师】-案例篇(十四)数据库与分布式
1、规范化 不满足3NF,导致的存储异常 原关系模式 航班(航班编号,航空公司,起飞地,起飞时间,目的地,到达时间,剩余票数,票价) 代理商(代理商编号…...

Golang实现递归复制文件夹
代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…...

【漏洞复现】用友U8 CRM uploadfile 文件上传致RCE漏洞
0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 uploadfle.php 文件存在任意文件上传漏洞,未经身份验证的攻击者通过漏洞上传…...

键盘盲打是练出来的
键盘盲打是练出来的,那该如何练习呢?很简单,看着屏幕提示跟着练。屏幕上哪里有提示呢?请看我的截屏: 截屏下方有8个带字母的方块按钮,这个就是提示,也就是我们常说的8个基准键位,我…...
构建sqli-labs学习环境与掌握SQL注入技术教程
根据提供的文档内容,以下是关于安装sqli-labs学习环境和SQLI-LABS教学的详细步骤和知识点: 安装sqli-labs学习环境 环境准备 操作系统:CentOS 7.6主机名:xuegod63IP地址:192.168.1.63 关闭防火墙和SELinux 禁用并…...

力扣HOT100 - 1143. 最长公共子序列
解题思路: 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…...

【贪心算法题目】
1. 柠檬水找零 这一个题目是一个比较简单的模拟算法,只需要根据手里的钱进行找零即可,对于贪心的这一点,主要是在20元钱找零的情况下,此时会出现两种情况:10 5 的组合 和 5 5 5 的组合,根据找零的特点&a…...
yarn常用命令
Yarn 是一个快速、可靠且安全的依赖管理工具,用于替代 npm。以下是一些常用的 Yarn 命令,用于不同的包管理和项目依赖安装场景: 初始化一个新的项目 yarn init这个命令会引导你创建一个 package.json 文件。 安装依赖 yarn add [package]…...

nginx+nginx-http-flv-module在Linux服务器搭建
需求 在服务器搭建点播/视频平台的话需要在服务器搭建nginx和rtmp模块 rtmp模块 rtmp 模块有 nginx-rtmp-module ,但是我们这里使用 nginx-http-flv-module 来替代。因为后者是基于前者开发的,前者拥有的功能后者都有,后者是国内的开发开…...

多线程(八)
一、wait和notify 等待 通知 机制 和join的用途类似,多个线程之间随机调度,引入 wait notify 就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略 内核里的线程调度,仍然是无序的. 相当于是在应用程序…...

投骰子——(随机游戏的控制)
精华点在于:利用封装,函数之间的良好调用,从而清晰明了的解决问题。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> # include<stdlib.h> # include<time.h> # include"math.h" # define ARR_LEN 10 # d…...
找出最长等值子数组
问题 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 如果子数组中所有元素都相等,则认为子数组是一个 等值子数组 。注意,空数组是 等值子数组 。 从 nums 中删除最多 k 个元素后,返回可能的最长等值子数组的长度。 子数组 是数…...

Go 切片常用操作与使用技巧
1.什么是切片 在 Go 语言中的切片(slice)是一种灵活的动态数组,它可以自动扩展和收缩,是 Go 语言中非常重要的数据结构之一。切片是基于数组实现的,它的底层是数组,可以理解为对底层数组的抽象。它会生成一…...

2024 中青杯高校数学建模竞赛(A题)数学建模完整思路+完整代码全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024 长三角高校数学建模竞赛(A题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过…...
开源与闭源:AI模型发展的双重路径之争
前言 随着人工智能(AI)技术的飞速发展,AI模型的应用已经渗透到各行各业,从医疗、金融到制造、教育,无不受到AI技术的深刻影响。在讨论一个AI模型“好不好”“有没有发展”时,绕不过“开源”和“闭源”两条…...

微信小程序---小程序文档配置(2)
一、小程序文档配置 1、小程序的目录结构 1.1、目录结构 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page 一个小程序主体部分由三个文件组成,必须放在项目的根目录 比如当前我们的《第一个小程序》项目根目录下就存在这三个文件: 1…...

15:00面试,15:08就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...

电磁兼容(EMC):去耦电容设计详解
目录 1. 概念 2. 去耦电容工作机理 3. 去耦电容大小选择 4. 去耦电容PCB布局 电容在电路中不同作用有不同的称呼去耦电容、旁路电容、储能电容,而这些作用又可以统称为滤波。本文将详细解读一下三者之间的差别,并着重说明一下去耦电容的设计方法。 …...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...