java23种设计模式-建造者模式
建造者模式(Builder Pattern)学习笔记
1. 模式定义
建造者模式是一种创建型设计模式,通过分步构建复杂对象的方式,将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。
2. 适用场景
✅ 需要创建包含多个部件的复杂对象
✅ 需要控制对象的创建过程(分步骤构建)
✅ 需要构建不同表示的对象(相同构建过程不同实现)
✅ 希望避免构造器参数过多(解决"伸缩构造函数"问题)
3. 模式结构
4. 核心角色
| 角色 | 说明 |
|---|---|
| Director | 指挥者,控制构建过程(非必须) |
| Builder | 抽象建造者,定义构建步骤的接口 |
| ConcreteBuilder | 具体建造者,实现构建步骤并返回产品 |
| Product | 最终构建的复杂对象 |
5. 代码示例
5.1 产品类
public class Computer {private String cpu;private String ram;private String storage;// 构造函数、getters、toString...
}
5.2 抽象建造者
public interface ComputerBuilder {void buildCPU();void buildRAM();void buildStorage();Computer getResult();
}
5.3 具体建造者
public class GamingComputerBuilder implements ComputerBuilder {private Computer computer = new Computer();@Overridepublic void buildCPU() {computer.setCpu("Intel i9-13900K");}@Overridepublic void buildRAM() {computer.setRam("64GB DDR5");}@Overridepublic void buildStorage() {computer.setStorage("2TB NVMe SSD");}@Overridepublic Computer getResult() {return computer;}
}
5.4 指挥者(可选)
public class Director {private ComputerBuilder builder;public Director(ComputerBuilder builder) {this.builder = builder;}public Computer construct() {builder.buildCPU();builder.buildRAM();builder.buildStorage();return builder.getResult();}
}
5.5 客户端调用
public class Client {public static void main(String[] args) {ComputerBuilder builder = new GamingComputerBuilder();Director director = new Director(builder);Computer computer = director.construct();// 或直接使用建造者ComputerBuilder builder2 = new OfficeComputerBuilder();builder2.buildCPU();builder2.buildRAM();Computer simpleComputer = builder2.getResult();}
}
6. 模式变种
- 链式调用版:
public class Computer {// 使用静态内部类实现public static class Builder {private String cpu;private String ram;public Builder withCPU(String cpu) {this.cpu = cpu;return this;}public Builder withRAM(String ram) {this.ram = ram;return this;}public Computer build() {return new Computer(this);}}
}
// 使用:new Computer.Builder().withCPU("i7").withRAM("16GB").build();
7. 优缺点分析
✔️ 优点:
- 分离构建过程和表示
- 更好的控制构建过程
- 方便扩展新的产品类型
- 避免过多构造函数参数
❌ 缺点:
- 增加代码复杂度
- 产品需要高度相似才适用
- 对简单对象的创建可能显得冗余
8. 相关模式对比
| 模式 | 关注点 | 复杂度 | 使用场景 |
|---|---|---|---|
| 工厂模式 | 对象整体创建 | 低 | 创建单一类型对象 |
| 抽象工厂模式 | 产品族的创建 | 高 | 创建相关对象家族 |
| 建造者模式 | 分步构建复杂对象 | 中 | 需要分步骤构建的复杂对象 |
9. 实际应用案例
- Java中的StringBuilder
- Spring中的BeanDefinitionBuilder
- Lombok的@Builder注解实现
- Android中的AlertDialog.Builder
10. 最佳实践建议
- 当构造器参数超过4个时考虑使用
- 需要创建不可变对象时优先使用
- 使用链式调用增强可读性
- 当构建顺序重要时一定要保留Director角色
📌 记忆技巧:把建造者模式想象成"分步填表"的过程,最后提交表格生成完整对象。
相关文章:
java23种设计模式-建造者模式
建造者模式(Builder Pattern)学习笔记 1. 模式定义 建造者模式是一种创建型设计模式,通过分步构建复杂对象的方式,将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。 2. 适用场景 ✅ 需要创建包含多个…...
JMeter 中实现 100 个用户在 3 秒内并发登录
在 JMeter 中实现 100 个用户在 3 秒内并发登录,需要合理配置线程组、定时器和测试逻辑。以下是具体步骤: 1. 创建测试计划 打开 JMeter。右键点击“Test Plan”,选择 Add > Threads (Users) > Thread Group。 : 设置为 100(模拟 100 个用户)。 : 设置为 3...
SOME/IP-SD -- 协议英文原文讲解2
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…...
IntelliJ IDEA中Maven配置全指南
一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文:环境配置 1.2 IDEA配置步骤 打开设置面板:File → Settings → Build → Build Tools → Maven 关键配置项: Maven home path E:\apache-maven-3.9.9 (…...
第438场周赛:判断操作后字符串中的数字是否相等、提取至多 K 个元素的最大总和、判断操作后字符串中的数字是否相等 Ⅱ、正方形上的点之间的最大距离
Q1、判断操作后字符串中的数字是否相等 1、题目描述 给你一个由数字组成的字符串 s 。重复执行以下操作,直到字符串恰好包含 两个 数字: 从第一个数字开始,对于 s 中的每一对连续数字,计算这两个数字的和 模 10。用计算得到的新…...
20-R 绘图 - 饼图
R 绘图 - 饼图 R 语言提供来大量的库来实现绘图功能。 饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表,用于描述量、频率或百分比之间的相对关系。 R 语言使用 pie() 函数来实现饼图,语法格式如下: pie(x, l…...
【LLM】R1复现项目(SimpleRL、OpenR1、LogitRL、TinyZero)持续更新
note (1)未来的工作需亟待解决: 支持大规模 RL 训练(PPO、GRPO 等)的开源基础框架用于稳定训练的 GRPO 训练超参的自动化调优RL 训练数据的配比(难度、领域、任务等)基于 Instruct 模型训练 R…...
Linux 内核网络设备驱动编程:私有协议支持
一、struct net_device的通用性与私有协议的使用 struct net_device是Linux内核中用于描述网络设备的核心数据结构,它不仅限于TCP/IP协议,还可以用于支持各种类型的网络协议,包括私有协议。其原因如下: 协议无关性:struct net_device的设计是通用的,它本身并不依赖于任何…...
20241130 RocketMQ本机安装与SpringBoot整合
目录 一、RocketMQ简介 ???1.1、核心概念 ???1.2、应用场景 ???1.3、架构设计 2、RocketMQ Server安装 3、RocketMQ可视化控制台安装与使用 4、SpringBoot整合RocketMQ实现消息发送和接收? ? ? ? ? 4.1、添加maven依赖 ???4.2、yaml配置 ???4.3、…...
FFmpeg进化论:从av_register_all手动注册到编译期自动加载的技术跃迁
介绍 音视频开发都知道 FFmpeg,因此对 av_register_all 这个 API 都很熟悉,但ffmpeg 4.0 版本开始就已经废弃了,是旧版本中用于全局初始化的重要接口。 基本功能 核心作用:av_register_all() 用于注册所有封装器(muxer)、解封装器(demuxer)和协议处理器(protocol),…...
Http升级为Https - 开发/测试服环境
1.应用场景 主要用于开发/测试服环境将http升级为https, 防止前端web(浏览器)出现Mixed Content报错; 2.学习/操作 1.文档阅读 deepseek 问答; 2.整理输出 报错信息: Mixed Content: The page at <URL> was loaded over HTTPS, but requested an insecure XMLHttpRequ…...
C语言预编译
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、预处理的作用与流程…...
算法刷题-字符串-151.反转单词
题目 给一串字符串,里面有若干单词,以空格界定单词的结束,翻转其中的单词 输入:s " hello world " 输出:“world hello” 需要注意的是,给定的字符串可能存在头空格、尾空格以及中间的空格数量…...
单片机裸机编程:状态机与其他高效编程框架
在单片机裸机编程中,状态机是一种非常强大的工具,能够有效管理复杂的逻辑和任务切换。除了状态机,还有其他几种编程模式可以在不使用 RTOS 的情况下实现高效的程序设计。以下是一些常见的方法: 1. 状态机编程 状态机通过定义系统…...
图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF
将VSDX转换为PDF可让用户轻松共享图表。PDF 文件保留原始文档的布局和设计。它们广泛用于演示文稿、报告和文档。在这篇博文中,我们将探讨如何在 Python 中将 VSDX 转换为 PDF。 本文涵盖以下主题: Python VSDX 到 PDF 转换器库使用 Python 将 VSDX 转…...
DPVS-1:编译安装DPVS (ubuntu22.04)
操作系统 rootubuntu22:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy rootubuntu22:~# 前置软件准备 apt install git apt install meson apt install gcc ap…...
即将发布书籍 - Yocto项目实战教程:高效定制嵌入式Linux系统
以下这本书《Yocto项目实战教程:高效定制嵌入式Linux系统》即将发布,现在请哪位大佬出山写一个序或者推荐,有兴趣的大佬,请联系我! Git仓库地址: https://github.com/jerrysundev/Yocto-Project-Book.git …...
Git 常用指令及其说明
配置相关 # 配置全局用户名 git config --global user.name "YourUsername"# 配置全局邮箱 git config --global user.email "your.emailexample.com"说明:这两条命令用于设置 Git 全局的用户名和邮箱,在提交代码时,这些…...
nginx代理后502
直接访问 https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions正常 使用nginx代理后访问出现502 server {listen 9999;server_name 172.21.3.78;location ^~ /compatible-mode {proxy_pass https://dashscope.aliyuncs.com;}location / {proxy_pass…...
大模型WebUI:Gradio全解12——LangChain原理及其agent构建Gradio(1)
大模型WebUI:Gradio全解12——LangChain原理及其agent构建Gradio(1) 前言本篇摘要12. LangChain原理及其agent构建Gradio12.1 LangChain概念及优势分析12.1.1 概念12.1.2 标准化组件接口1. 示例:聊天模型2. 示例:检索器12.1.3 编排组件12.1.4 便于部署12.1.5 可观测性和评…...
CN3166 符合 JEITA 标准可用太阳能供电的锂电池充电管理芯片
概述: CN3166是可以用太阳能供电的单节锂电池充电管理芯片。该器件内部包括功率晶体管,不需要外 部的电流检测电阻和阻流二极管。内部的充电电流自适应模块能够根据输入电源的电流输出能力 自动调整充电电流,用户不需要考虑最坏情况ÿ…...
从开源项目OV-Watch V2.4入手,手把手教你用STM32F411CEU6打造自己的智能手环(附完整BOM清单与焊接避坑指南)
从开源项目OV-Watch V2.4入手,手把手教你用STM32F411CEU6打造自己的智能手环(附完整BOM清单与焊接避坑指南) 在当今可穿戴设备蓬勃发展的时代,智能手环因其便携性和实用性成为众多科技爱好者的心头好。但对于真正热衷硬件开发的极…...
别再只会kill -USR2了!CentOS下php-fpm服务管理的正确姿势:从手动启动到systemd托管
从信号控制到服务托管:CentOS下php-fpm的现代化管理实践 在Linux服务器管理中,php-fpm作为PHP FastCGI进程管理器,其稳定性直接影响Web服务的质量。许多管理员至今仍在使用kill -USR2这类"祖传"命令来管理php-fpm进程,…...
如何用解构赋值快速提取数组前几个元素到独立变量
数组解构可安全提取前若干元素,长度不足时对应变量为undefined;支持跳过元素、设置默认值、获取剩余元素(...rest须在末尾);嵌套解构需严格匹配结构,函数参数解构需防null/undefined报错。用 const [a, b, …...
用周立功CAN分析仪抓包解析电动汽车充电握手报文(BMS/充电机通信实战)
电动汽车充电握手报文解析实战:从CAN抓包到BMS通信全解密 电动汽车充电过程中,BMS(电池管理系统)与充电机之间的通信就像两个陌生人在初次见面时的握手——需要确认身份、交换基本信息,并达成充电协议。而这一切&#…...
AD7656与DSP通信时序深度解析:如何用示波器搞定数据跳变和读取为0的故障
AD7656与DSP通信时序深度解析:如何用示波器搞定数据跳变和读取为0的故障 在高速数据采集系统的调试现场,AD7656模数转换器与DSP的通信问题堪称经典案例。当示波器屏幕上出现异常波形时,工程师需要像侦探破案一样,从时序关系的蛛丝…...
U盘如何防泄密?推荐六款常用的U盘防泄密软件,收藏了
在数字化办公的今天,U盘因为便携、好用,成了职场人几乎人手必备的工具。但对于企业管理者来说,这个小小的存储卡却可能成为安全漏洞的源头。一个不留神,公司的核心技术资料、客户名单或是财务报表,就可能随着一个几厘米…...
基于R语言的物种气候生态位动态量化与分布特征模拟实践技术
在全球气候变化加剧与生物多样性丧失的双重危机下,精准量化物种的气候生态位、预测其潜在分布格局及动态迁移路径,已成为入侵生物学风险评估、濒危物种栖息地保护及自然保护区规划的核心科学命题。物种分布模型作为连接物种 occurrence 数据与环境变量的…...
bootstrap怎么实现带有验证状态的表单
需手动在表单控件(input/select/textarea)上添加 is-valid 或 is-invalid 类,并紧邻放置 valid-feedback 或 invalid-feedback 元素作为下一个兄弟节点,配合 blur 或 submit 事件触发验证逻辑。怎么给 Bootstrap 表单控件加 is-va…...
LeetCode高频算法精讲:大厂面试知识体系完全指南
算法面试是互联网大厂招聘的核心环节,掌握高频题型和解题模板是通关关键。本文系统讲解LeetCode上的五大高频题型:二分查找、滑动窗口、DFS/BFS、动态规划和贪心算法。每种算法包含原理讲解、标准模板、变体应对和复杂度分析,配合大量完整代码…...
