二十三种设计模式-建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种分步骤构建复杂对象的方法。这种模式允许你通过相同的创建过程构建不同的表示。建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的对象。
建造者模式的主要角色
- 产品(Product):需要被构建的复杂对象。
- 抽象建造者(Builder):一个接口或抽象类,它规定了建造产品的必要步骤。
- 具体建造者(Concrete Builder):实现抽象建造者接口,完成产品构建的具体步骤,并提供一个方法返回构建好的产品。
- 指挥者(Director):包含客户端代码,负责按照某种顺序调用建造者接口的方法,以指导构建过程。
- 客户端(Client):创建具体的建造者对象,然后通过指挥者对象指定的构建步骤来构建复杂对象。
建造者模式的实现步骤
- 定义产品类:创建一个包含多个属性和相应setter方法的产品类。
- 定义抽象建造者:创建一个包含建造复杂对象步骤的接口或抽象类。
- 实现具体建造者:实现抽象建造者接口,定义具体产品的类型。
- 实现指挥者:创建一个指挥者类,它接受一个建造者对象,并包含构建复杂对象的方法。
- 客户端代码:使用具体建造者对象和指挥者对象来构建产品。
建造者模式的代码示例
// 产品类
class Product {private String partA;private String partB;private String partC;// 省略getter和setter方法
}// 抽象建造者
interface Builder {void buildPartA();void buildPartB();void buildPartC();Product getResult();
}// 具体建造者
class ConcreteBuilder implements Builder {private Product product = new Product();public void buildPartA() {product.setPartA("PartA");}public void buildPartB() {product.setPartB("PartB");}public void buildPartC() {product.setPartC("PartC");}public Product getResult() {return product;}
}// 指挥者
class Director {public void construct(Builder builder) {builder.buildPartA();builder.buildPartB();builder.buildPartC();}
}// 客户端代码
public class BuilderPatternDemo {public static void main(String[] args) {Builder builder = new ConcreteBuilder();Director director = new Director();director.construct(builder);Product product = builder.getResult();// 使用product对象}
}
建造者模式的优点
- 封装性:建造者模式将产品构建过程封装在建造者类中,使得客户端不需要知道产品内部的构建细节。
- 灵活性:客户端可以只通过指挥者类来指导产品的构建,而不需要关心具体的建造逻辑。
- 扩展性:新增具体建造者类不会影响其他类,易于扩展新的建造过程。
- 解耦:客户端和产品构建逻辑解耦,提高了代码的可维护性。
建造者模式的缺点
- 类的个数增多:每增加一个产品,可能需要增加新的建造者类和产品类,导致系统更加复杂。
- 对象创建变得复杂:对于简单的对象,使用建造者模式可能会使对象创建过程变得过于复杂。
建造者模式特别适用于创建复杂对象,其中对象的创建过程需要多个步骤,或者对象的创建过程需要灵活多变。这种模式在需要精细控制对象构建过程的场景中非常有用,例如在复杂的XML文档构建、数据库查询构建等场景中。
相关文章:
二十三种设计模式-建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种分步骤构建复杂对象的方法。这种模式允许你通过相同的创建过程构建不同的表示。建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的对象…...
MarkDown 的 mermaid gantt(甘特图)、mermaid sequenceDiagram (流程图) 语法解析和应用
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 MarkDown 的 mermaid gantt、mermaid sequenceDiagram 语法解析和应用前言mermaid gan…...
git submodule的使用:将别人的git仓库作为自己的子仓库
git的基本操作在该篇中展示:git的基本操作在日常开发中,我们经常会碰到需要将别人的仓库作为自己的子仓库来进行开发。下面将介绍具体将如何操作。 1、添加Submodule至自己的git仓库 1.1、创建自己的Git仓库 (1)在github中创建自…...
Springboot 下载附件
GetMapping("/download") public void download(RequestParam String fileId, HttpServletResponse response) throws IOException {// 查询文件信息SysFileEntity sysFileEntity fileService.queryFileById(fileId);response.setContentType("application/oct…...
MySQL 延迟复制:确保数据安全与系统稳定的秘诀
MySQL 延迟复制:确保数据安全与系统稳定的秘诀 在 MySQL 主从复制架构中,数据的同步通常是实时的。然而,在一些特定场景下,我们可能不希望从库立刻同步主库的所有更新。特别是在高风险操作或者主库出现故障时,实时复制…...
ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana
前言 你知道对于一个系统的上线考察,必备的几样东西是什么吗?其实这也是面试中考察求职者,是否真的做过系统开发和上线的必备问题。包括:服务治理(熔断/限流) (opens new window)、监控 (opens new window)和日志,如果…...
python实现自动登录12306抢票 -- selenium
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码,但是都不是最新的,我也是从网上找别人的帖子,看B站视频&…...
使用Diffusion Models进行图像超分辩重建
Diffusion Models专栏文章汇总:入门与实战 前言:图像超分辨率重建是一个经典CV任务,其实LR(低分辨率)和 HR(高分辨率)图像仅在高频细节上存在差异。通过添加适当的噪声,LR 图像将变得与其 HR 对应图像无法区分。这篇博客介绍一种方式巧妙利用这个规律使用Diffusion Mod…...
吾杯网络安全技能大赛——Misc方向WP
吾杯网络安全技能大赛——Misc方向WP Sign 题目介绍: 浅浅签个到吧 解题过程: 57754375707B64663335376434372D333163622D343261382D616130632D3634333036333464646634617D 直接使用赛博橱子秒了 flag为 WuCup{df357d47-31cb-42a8-aa0c-6430634ddf4a} 原神启动…...
Web安全 - “Referrer Policy“ Security 头值不安全
文章目录 概述原因分析风险说明Referrer-Policy 头配置选项1. 不安全的策略no-referrer-when-downgradeunsafe-url 2. 安全的策略no-referreroriginorigin-when-cross-originsame-originstrict-originstrict-origin-when-cross-origin 推荐配置Nginx 配置示例 在 Nginx 中配置 …...
C#OPC(上)
OPC(OLE for Process Control),用于过程控制的OLE,是一个工业标准,管理这个标准的国际组织是OPC基金会,OPC基金会现有会员以超过220家。遍布全球,包括世界上所有主要的自动化控制系统、仪器仪表及过程控制系统的公司。基于微软的O…...
Imgui + Cmake + OpenGL + GLFW 隐藏控制台窗口
网上一般是VS,如何在属性里面把控制台改为窗口 本文,使用Clion Cmake,实现如何隐藏控制台窗口 环境:OpenGL3 GLFW 添加头文件#include <windows.h>把main函数入口改为int WinMain(HINSTANCE hInstance, HINSTANCE hPrevI…...
Spring Boot(七):Swagger 接口文档
1. Swagger 简介 1.1 Swagger 是什么? Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…...
RabbitMQ - 4 ( 22000 字 RabbitMQ 入门级教程 )
一: RabbitMQ 高级特性 前面主要讲解了 RabbitMQ 的概念和应用。RabbitMQ 实现了 AMQP 0-9-1 规范,并在此基础上进行了多项扩展。在 RabbitMQ 官方网站中详细介绍了其特性,我们将其中一些重要且常用的特性挑选出来进行讲解。 1.1 消息确认 …...
印象笔记07——试一试PDF标注
印象笔记07——试一试PDF标注 [!CAUTION] 根据第六期,我再次查询了资料,印象笔记还是有一些可圈可点的功能的(当然部分有平替),针对会员作用,开发使用场景虽然是逆向的,但我坚信这是一部分人的现…...
Vue3实战教程》24:Vue3自定义指令
如果您有疑问,请观看视频教程《Vue3实战教程》 自定义指令 介绍 除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外,Vue 还允许你注册自定义的指令 (Custom Directives)。 我们已经介绍了两种在 Vue 中重用代码的方式:组件和组…...
【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向
【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向 【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向 文章目…...
【ArcGIS Pro/GeoScene Pro】可视化时态数据
可视化过去二十年新西兰国际旅游业的发展变化 工程数据下载 ArcGIS Pro 快速入门指南—ArcGIS Pro | 文档 添加数据 数据为中国旅客数据 转置表字段 列数据转行数据...
Linux buildroot和ubuntu的异同点
Buildroot 和 Ubuntu 都是 Linux 系统的操作环境,但它们的设计理念和使用场景有很大的不同。 一、定义与目标 Buildroot Buildroot 是一个用于生成嵌入式 Linux 系统的工具集,专注于交叉编译和构建嵌入式设备的最小 Linux 环境。它的目标是为嵌入式系统提供定制化和优化的…...
k8s系列--通过docker拉取的镜像导入到 containerd中
要将通过 docker pull 拉取的镜像导入到 containerd 中,可以按照以下步骤操作: 步骤 1:使用 docker 将镜像保存为 tar 文件 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1 docker save registry.cn-ha…...
如何提高YOLO8目标检测的准确性?
上面主要就是大致了解方法,省流请看最下面1.提高置信度阈值yolo predict modelyolov8n.pt source0 classes0 conf0.5 conf0.3(灵敏,但容易误检) conf0.5(更准,误检少) …...
DLSS Swapper实战指南:高效管理DLSS版本3步达成游戏性能跃升
DLSS Swapper实战指南:高效管理DLSS版本3步达成游戏性能跃升 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 当你在4K分辨率下启动《赛博朋克2077》,满心期待沉浸在夜之城的霓虹中时,…...
IDM注册表权限控制技术深度解析:突破30天试用期的终极方案
IDM注册表权限控制技术深度解析:突破30天试用期的终极方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 核心技术原理:Windows注册表权…...
OpenClaw FPGA资源利用率优化深度指南
OpenClaw FPGA资源利用率优化深度指南🔧 核心价值:OpenClaw实现"资源分析→智能优化→验证→部署"全流程自动化,资源利用率平均提升45%,功耗降低38%,时序性能提升28%,支持Xilinx/Intel FPGA全系列…...
dfs经典例题——迷宫问题(利用二维数组优化方向判断)
思路:首先关于方向问题,我们可以设定一个默认方向,比如先默认向右,触底向下,然后再是向左向上。只需要平行在dfs函数中即可,每次递归会自动依次按照if条件进行合适方向的查找初始量:地图数组&am…...
Python医学影像处理实战:5分钟搞定NII/NRRD/DICOM格式互转(附完整代码)
Python医学影像格式转换实战:NII/NRRD/DICOM互转与可视化技巧 医学影像处理是医疗AI和临床研究的基础环节,而格式转换往往是数据处理流程中的第一个技术门槛。本文将带您快速掌握Python环境下NII、NRRD、DICOM三大主流医学影像格式的互转技巧,…...
Swift-Corelibs-Foundation 架构演进:从 Objective-C 到 Swift 的完整迁移指南
Swift-Corelibs-Foundation 架构演进:从 Objective-C 到 Swift 的完整迁移指南 【免费下载链接】swift-corelibs-foundation The Foundation Project, providing core utilities, internationalization, and OS independence 项目地址: https://gitcode.com/gh_mi…...
突破限制:3大核心功能让MediaCreationTool.bat成为Windows安装自由的终极解决方案
突破限制:3大核心功能让MediaCreationTool.bat成为Windows安装自由的终极解决方案 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/Media…...
手机也能跑Llama?聊聊移动端/边缘设备部署LLM的现状、挑战与未来展望
手机也能跑Llama?移动端大语言模型部署实战指南 当ChatGPT掀起生成式AI浪潮时,大多数人都认为这类技术只能依赖云端算力。但2023年Meta开源Llama系列模型后,一个令人兴奋的问题开始被频繁讨论:我们能否在手机这样的移动设备上本地…...
低成本自动化方案:OpenClaw+自部署千问3.5-27B替代ChatGPT API调用
低成本自动化方案:OpenClaw自部署千问3.5-27B替代ChatGPT API调用 1. 为什么选择本地模型OpenClaw组合 去年我用ChatGPT API开发自动化脚本时,发现一个致命问题:当任务需要连续调用多个API时(比如先搜索资料再整理成报告&#x…...
