重学设计模式-建造者模式
本文介绍一下建造者模式,相对于工厂模式来说,建造者模式更为简单,且用的更少
定义
建造者模式是一种创建型设计模式,它使用多个简单的对象一步一步构建成一个复杂的对象。这种模式的主要目的是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
使用场景
- 当创建复杂对象的过程独立于它们的组成部分以及它们的装配顺序时:可以使用建造者模式来逐步构建复杂对象。
- 当构造过程必须允许被不同创建出来:例如,一个文本文档可能需要根据不同的格式(如HTML、纯文本等)来创建。
- 当类具有强制的分阶段创建过程时:例如,某些产品可能需要先安装基础部分,然后再添加可选的额外功能。
建造者模式主要有四个主体:
- 抽象建造者 Builder:相当于建筑蓝图,声明了创建 Product 对象的各个部件指定的抽象接口。
- 具体建造者 ConcreteBuilder:实现Builder抽象接口,构建和装配各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
- 指挥者 Director:构建一个使用 Builder 接口的对象。主要有两个作用,一是隔离用户与对象的生产过程,二是负责控制产品对象的生产过程。
- 产品角色 Product:被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
代码示例:
// 定义产品类
class House {private List<String> parts = new ArrayList<>();public void addPart(String part) {parts.add(part);}public void show() {for (String part : parts) {System.out.print(part + " ");}System.out.println();}
}// 定义抽象建造者
abstract class HouseBuilder {protected House house;public abstract void buildBase();public abstract void buildWalls();public abstract void buildRoof();public abstract void buildWindows();public abstract House getResult();
}// 具体建造者A
class ConcreteHouseBuilderA extends HouseBuilder {public ConcreteHouseBuilderA() {this.house = new House();}@Overridepublic void buildBase() {house.addPart("Base");}@Overridepublic void buildWalls() {house.addPart("Walls");}@Overridepublic void buildRoof() {house.addPart("Roof");}@Overridepublic void buildWindows() {house.addPart("Windows");}@Overridepublic House getResult() {return house;}
}// 具体建造者B
class ConcreteHouseBuilderB extends HouseBuilder {public ConcreteHouseBuilderB() {this.house = new House();}@Overridepublic void buildBase() {house.addPart("Foundation");}@Overridepublic void buildWalls() {house.addPart("Side walls");}@Overridepublic void buildRoof() {house.addPart("Flat roof");}@Overridepublic void buildWindows() {house.addPart("Large windows");}@Overridepublic House getResult() {return house;}
}// 指挥者
class Director {public House construct(HouseBuilder builder) {builder.buildBase();builder.buildWalls();builder.buildRoof();builder.buildWindows();return builder.getResult();}
}// 客户端代码
public class Main {public static void main(String[] args) {Director director = new Director();// 使用ConcreteHouseBuilderA构建房子HouseBuilder builderA = new ConcreteHouseBuilderA();House houseA = director.construct(builderA);System.out.println("House A:");houseA.show();// 使用ConcreteHouseBuilderB构建房子HouseBuilder builderB = new ConcreteHouseBuilderB();House houseB = director.construct(builderB);System.out.println("House B:");houseB.show();}
}
在上面的代码中,我们首先定义了一个House
类,它有一个方法add_part
用于添加房子的各个部分,还有一个方法show
用于显示房子的所有部分。然后,我们定义了一个抽象的HouseBuilder
类,它声明了四个方法(build_base
, build_walls
, build_roof
, build_windows
)和一个get_result
方法。接下来,我们实现了两个具体的建造者类ConcreteHouseBuilderA
和ConcreteHouseBuilderB
,它们分别按照不同的方式构建房子。最后,我们定义了一个Director
类,它负责指挥建造者按照一定的步骤构建房子。在客户端代码中,我们创建了两个不同的建造者,并使用同一个导演来构建两种不同类型的房子。
相关文章:
重学设计模式-建造者模式
本文介绍一下建造者模式,相对于工厂模式来说,建造者模式更为简单,且用的更少 定义 建造者模式是一种创建型设计模式,它使用多个简单的对象一步一步构建成一个复杂的对象。这种模式的主要目的是将一个复杂对象的构建过程与其表示…...
linux下c++调用opencv3.4.16实战技巧
目录 参考:在图像上绘框在图像上绘圆在图像上绘文字在图像上绘制线灰度图rgb转yuvOpenCV 读取视频,设置起始帧、结束帧及帧率获取(1.1)简介(1.2)Mat类型(1.3)IplImage类型将OpenCV抓拍的图片进行x264编码并保存到文件c++调用opencv,读取rtsp视频流参考: https://blog…...
记录css模糊程度的属性
记录需要模糊以及透明化图片需求: opacity: (0到1之间数字,dom透明程度)。 filter: blur() 括号里需数字,单位为px,值越大模糊程度越大。 关于css中filter属性记录 filter 滤镜属性: blur&…...
K8S的监控与告警配置有哪些最佳实践
在 Kubernetes (K8s) 集群中实现有效的监控与告警是确保集群稳定性、性能以及及时响应潜在问题的关键。以下是 K8s 监控与告警配置的最佳实践,涵盖了监控工具的选择、告警规则的配置、数据存储与可视化等方面。 1. 选择合适的监控工具 Kubernetes 生态系统有多种监…...
如何在Ubuntu 20.04上安装和使用PostgreSQL:一步步指南
如何在Ubuntu 20.04上安装和使用PostgreSQL:一步步指南 在Ubuntu 20.04上安装和使用PostgreSQL数据库包括几个明确的步骤:安装、配置、创建用户和数据库、以及基本的数据库操作。下面,我将详细解释每个步骤,并提供具体的命令行示…...
PostGis学习笔记
– 文本方式查看几何数据 SELECT ST_AsText(geom)FROM nyc_streets WHERE name ‘Avenue O’; – 计算紧邻的街区 SELECT name,ST_GeometryType(geom) FROM nyc_streets WHERE ST_DWithin( geom,ST_GeomFromText(‘LINESTRING(586782 4504202,586864 4504216)’,26918),0.1); …...
JDK17 线程池 ThreadPoolExecutor
文章目录 线程池ThreadPoolExecutor状态向线程池添加任务 executeWorker线程池新建工作线程 addWorker 拒绝策略 线程池 线程池将创建线程和使用线程解耦。优点是 避免重复创建和销毁线程,降低资源消耗。任务不用等待创建线程的时间,提高响应速度。统一…...
Dify+Docker
1. 获取代码 直接下载 (1)访问 langgenius/dify: Dify is an open-source LLM app development platform. Difys intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, …...
分布式会话 详解
分布式会话详解 在分布式系统中,用户的会话状态需要在多个服务器或节点之间共享或存储。分布式会话指的是在这种场景下如何管理和存储会话,以便在多个节点上都能正确识别用户状态,从而保证用户体验的一致性。 1. 为什么需要分布式会话 在单…...
Java进阶
Java进阶 java注解 java中注解(Annotation),又称为java标注,是一种特殊的注释,可以添加在包,类,成员变量,方法,参数等内容上面.注解会随同代码编译到字节码文件中,在运行时,可以通过反射机制获取到类中的注解,然后根据不同的注解进行相应的解析. 内置注解 Java 语言中已经定…...
Qt/C++实现帧同步播放器/硬解码GPU绘制/超低资源占用/支持8K16K/支持win/linux/mac/嵌入式/国产OS等
一、前言 首先泼一盆冷水,在不同的电脑上实现完完全全的帧同步理论上是不可能的,市面上所有号称帧同步的播放器,同一台电脑不同拼接视频可以通过合并成一张图片来绘制实现完完全全的帧同步,不同电脑,受限于网络的延迟…...
hhdb数据库介绍(10-33)
管理 数据归档 归档记录查询 功能入口:“管理->数据归档->归档记录查询” 需要确保配置的归档用户对数据归档规则所在的逻辑库具备CREATE权限,以及对原数据表具有所有权限。 清理归档数据 (一)功能入口:“…...
UE4_材质节点_有关距离的_流体模拟
一、材质节点介绍: 特别注意:距离场需要独立显卡支持。 1、什么是距离场? 想象一下空间中只有两个实体, 一个球,一个圆柱. 空间由无数个点组成, 取其中任何一个点, 比如,它跟球面的最近距离是3, 跟圆柱面的最近距离是2, 那么这个点的值就…...
SpringBoot集成 SpringDoc (SpringFox 和 Swagger 的升级版)
阅读 SpringDoc 官网 - Migrating from SpringFox 只需要导入以下一个依赖即可: <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.7.0</version>…...
分布式推理框架 xDit
1. xDiT 简介 xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers(DiTs)设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术,以满足实时推理需求。 1.1 DiT 和 LLM DiT(Diffusion Transformers&am…...
《Vue零基础入门教程》第十七课:侦听器
往期内容 《Vue零基础入门教程》第九课:插值语法细节 《Vue零基础入门教程》第十课:属性绑定指令 《Vue零基础入门教程》第十一课:事件绑定指令 《Vue零基础入门教程》第十二课:双向绑定指令 《Vue零基础入门教程》第十三课&…...
【人工智能-基础】SVM中的核函数到底是什么
文章目录 支持向量机(SVM)中的核函数详解1. 什么是核函数?核函数的作用:2. 核技巧:从低维到高维的映射3. 常见的核函数类型3.1 线性核函数3.2 多项式核函数3.3 高斯径向基函数(RBF核)4. 总结支持向量机(SVM)中的核函数详解 支持向量机(SVM,Support Vector Machine)…...
RoBERTa- 稳健优化的 BERT 预训练模型详解
一、引言 自 BERT(Bidirectional Encoder Representations from Transformers)问世,预训练语言模型在自然语言处理(NLP)领域掀起革命浪潮,凭卓越表现大幅刷新诸多任务成绩。RoBERTa 承继 BERT 架构&#x…...
20.(开发工具篇github)Git上次超过100M单文件
1:安装lfs git lfs install 2: 撤销所有更改(包括未暂存的更改) git reset --hard 3:查找大于100M的文件 find ./ -size 100M 4:加入到 track git lfs track “./data/geo_tif_zzjg/2023年_种植结构影像.tif” git lfs track “./data/geo_tif_zz…...
Redis使用场景-缓存-缓存击穿
前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题,其中缓存穿透、击穿、雪崩在面试中问的最频繁,本文加了图解,希望帮助你更直观的了解缓存击穿😀 (放出之前写的针对实习面试的关于Redis生产问题的博…...
uniapp Electron打包生成桌面应用exe文件
1.uniapp Electron打包生成桌面应用exe文件 随着跨平台开发的需求日益增长,UniApp 成为了开发者们的首选之一。通过 UniApp,你可以使用 Vue.js 的语法结构和组件系统来构建原生应用、Web 应用甚至是桌面应用。本文将详细介绍如何使用 UniApp 将你的项目打包成 Windows 桌面端…...
【机器学习】Sigmoid函数在深层神经网络中存在梯度消失问题,如何设计一种改进的Sigmoid激活函数,既能保持其概率预测优势,又能避免梯度消失?
为了解决 Sigmoid 函数在深层神经网络中的梯度消失问题,可以设计一种改进的 Sigmoid 激活函数,使其同时具备以下特性: 减缓梯度消失问题:避免在输入值远离零时梯度趋于零的问题。保持概率预测能力:保留 Sigmoid 的单调…...
SpringBoot中实现EasyExcel实现动态表头导入(完整版)
前言 最近在写项目的时候有一个需求,就是实现动态表头的导入,那时候我自己也不知道动态表头导入是什么,查询了大量的网站和资料,终于了解了动态表头导入是什么。 一、准备工作 确保项目中引入了处理 Excel 文件的相关库ÿ…...
前端用到的一些框架
拖拽框架:Vue.Draggable Vue.Draggable是一款基于Sortable.js拖拽插件 官网:https://github.com/SortableJS/Vue.Draggable 分屏插件:fullPage.js fullPage.js 是一个基于 jQuery 的插件,它能够很方便、很轻松的制作出全屏网站…...
“量子跃迁与数据织网:深入探索K最近邻算法在高维空间中的优化路径、神经网络融合技术及未来机器学习生态系统的构建“
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
10个Word自动化办公脚本
在日常工作和学习中,我们常常需要处理Word文档(.docx)。 Python提供了强大的库,如python-docx,使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本,帮助新…...
【青牛科技】D35摄氏温度传感器芯片,低功耗,静态工作电流小于60 μA
概述: D35是基于模拟电路的一种基本摄氏温度传感器,其作用是将感测的环境温度/物体温度精确的以电压的形式输出,且输出电压与摄氏温度成线性正比关系,转换公式为Vo0 10 mV / ℃*T(℃),0C时输出为…...
无分类编址的IPv4地址
/20含义:前20比特位为网络号,后面32-2012为主机号 路由聚合:找共同前缀 所有可分配地址的主机都能接收广播地址,...
LeetCode - #150 逆波兰表达式求值
文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…...
如何避免数据丢失:服务器恢复与预防策略
在当今数字时代,数据对于个人和企业来说都至关重要。数据丢失可能会导致严重的财务损失、业务中断甚至法律责任。因此,采取措施防止数据丢失至关重要。本文将讨论服务器数据丢失的常见原因以及如何防止数据丢失的有效策略。 服务器数据丢失的常见原因 服…...
pytorch中model.eval的理解
在复现simsam的过程中,看到在线性评估部分的训练函数中设置了model.eval,不太理解,印象中一直觉得,model.eval会影响梯度的回传,这里来拨乱反正一下。 事实上,model.eval()主要影响 BatchNorm 和 Dropout 层的行为&am…...
【AI+教育】一些记录@2024.11.19-11.25
通向AGI之路:大型语言模型(LLM)技术精要 https://zhuanlan.zhihu.com/p/597586623 在Bert和GPT模型出现之前,NLP领域流行的技术是深度学习模型,而NLP领域的深度学习,主要依托于以下几项关键技术࿱…...
CSS变量用法及实践
目录 一、基本用法 1.1、定义变量 1.2、使用变量 1.3 、修改变量的值 二、命名规范 2.1、使用有意义的名称 2.2、使用命名空间 三、变量值类型 3.1、如果变量值是一个字符串,可以与其他字符串拼接,例如: 3.2、 如果变量值是数值&a…...
【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接
目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档:它可以将复杂的HTML或XML文本转换为易于操作的树形结构…...
STM32 ADC --- 知识点总结
STM32 ADC — 知识点总结 文章目录 STM32 ADC --- 知识点总结cubeMX中配置注解单次转换模式、连续转换模式、扫描模式单通道采样的情况单次转换模式:连续转换模式: 多通道采样的情况禁止扫描模式(单次转换模式或连续转换模式)单次…...
使用PHP脚本实现GitHub API搜索与数据库同步
在现代软件开发中,自动化数据收集和同步是提高效率的关键。今天,我将分享一个我最近开发的PHP脚本,它能够自动从GitHub API搜索特定关键词的仓库,并将这些数据同步到MySQL数据库中。这个过程不仅涉及到API调用和数据处理ÿ…...
使用docker-compese部署SFTPGo详解
官网:SFTP & FTP as a Managed Service (SaaS) and On-premise 一、SFTPGo简介 SFTPGo 是一款功能强大的文件传输服务器软件。它支持多种协议(SFTP、SCP、FTP/S、WebDAV、HTTP/S)和多个存储后端。 借助 SFTPGo,您可以利用本地…...
JavaScript根据数据生成柱形图
分析需求 // 定义一个数组来存储四个季度的数据 dataArray = []// 循环4次,获取用户输入的数据并存储到数组中 for i from 0 to 3// 获取用户输入的数据inputData = 获取用户输入的第(i + 1)季度的数据// 将数据存入数组dataArray[i] = inputData// 遍历数组,根据数据生成柱…...
Android笔记【12】脚手架Scaffold和导航Navigation
一、前言 学习课程时,对于自己不懂的点的记录。 对于cy老师第二节课总结。 二、内容 1、PPT介绍scaffold 2、开始代码实操 先新建一个screen包,写一个Homescreen函数,包括四个页面。 再新建一个compenent包,写一个displayText…...
VirtualBox注册已有虚拟机:未能打开位于虚拟电脑E_INVALIDARG (0X80070057)
错误如下 解决办法1 产生虚拟机的机器,与当前使用机器不兼容。建议在当前机器重新产生虚拟机。比如我家里电脑是WIN7,公司电脑是WIN11。 原来的虚拟机内容,找老机器导出。 解决办法2(存疑) 搜索到一个说法…...
开发中使用UML的流程_08 PIM-4:定义操作及方法
目录 1、序列图概述 2、序列图调用方式 3、创建消息与销毁消息 4、几项建议 1、序列图概述 在PIM-4中,系统分析员可以用序列图来表达,系统内部一群对象合力完成某一个系统用例时,执行期间的交互情形。之后,序列图可能通过设计…...
软件设计 —— 检测按键单击、多击、长按或组合动作
目 录 按键单一动作识别按键组合动作识别 按键单一动作识别 带有按键的作品设计时,按键动作检测是必不可少的,如何判断按键是单击、双击、三击和长按动作呢? 1、定时器定时一个10ms周期 2、把按键检测函数放到这个周期内执行,即…...
【GPT】主要影响代谢的因素
代谢的快慢受到多种因素的影响,包括遗传、生活习惯和健康状况等。以下是主要影响代谢的因素: 1. 年龄 影响:年龄增长会导致基础代谢率(BMR)逐渐降低,这是因为随着年龄增加,肌肉量减少ÿ…...
LLM Agents can Autonomously Hack Websites 论文阅读
paper:LLM Agents can Autonomously Hack Websites abstract:近年来,大型语言模型(llm)已经变得越来越有能力,现在可以与工具交互(例如,调用函数),读取文档,并递归地调用自己。因此,这些llm现在可以作为代理自主运行。随着这些代理能力的提高,最近的工作推测了LLM代…...
STM32标准库-FLASH
FLASH模仿EEPROM STM32本身没有自带EEPROM,但是自带了FLASH存储器。 STM32F103ZET6自带 1M字节的FLASH空间,和 128K64K的SRAM空间。 STM32F4 的 SPI 功能很强大,SPI 时钟最高可以到 37.5Mhz,支持 DMA,可以配置为 SPI协…...
【机器学习】机器学习的基本分类-监督学习-决策树-ID3 算法
ID3(Iterative Dichotomiser 3)是决策树的一种构造算法,由 Ross Quinlan 在 1986 年提出。它主要用于分类问题,通过信息增益选择特征来构建决策树。ID3 假设数据是离散型特征,且不支持连续型数据。 1. 核心思想 划分标…...
nginx配置http及https
nginx配置http及https 1.动静分离2.负载均衡3.配置https4.请求重定向5.常用参数配置介绍 现在日常工作中的项目大多数都是采用前后端分离,就用到了nginx进行反向代理、处理静态资源等;因此,记录整理了nginx一些常用的配置; 1.动静…...
威联通-001 手机相册备份
文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段:1.Qfile Pro和2.Qsync Pro,实践使用中存在一些区别,针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…...
柔性数组详解+代码展示
系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…...
【oracle数据库提示oracle initialization or shutdown in process】
问题如下截图: 解决方案: 1.进入sqlplus,下图中红圈即处理方式 备注:redo03.log是数据库路径“E:\app\Administrator\oradata\MKDB3D\”下最新的归档日志文件 2.alter database open resetlogs 3.netmanager测试登录是否成功&am…...