Java设计模式之创建型—建造者模式

Java中最常用的设计模式-CSDN博客

“把对象的构造步骤拆成链式方法,调用者按需填参,最后一次性 build,避免构造函数爆炸。”

  1. 经典场景

  • 参数多(>4 个)且大部分可选

  • 需要不可变对象(final 字段)

  • 避免伸缩构造函数(telescoping constructor)

模板代码

public final class User {// ① 所有字段 final,不可变private final String name;private final int age;private final String phone;// ② 私有构造,只接受 Builderprivate User(Builder builder) {this.name  = builder.name;this.age   = builder.age;this.phone = builder.phone;}// ③ 静态内部 Builderpublic static class Builder {private String name;   // 必填private int age = -1;  // 可选默认值private String phone;public Builder(String name) { this.name = name; }public Builder age(int age)   { this.age = age; return this; }public Builder phone(String p){ this.phone = p; return this; }public User build() {// 参数校验放这里if (age < 0) throw new IllegalArgumentException("age missing");return new User(this);}}// ④ Getter(无 Setter)public String name()  { return name; }public int age()      { return age; }public String phone() { return phone; }
}

客户端链式调用

User user = new User.Builder("Alice").age(18).phone("13800138000").build();
优点缺点
可读性高,链式流畅多写 1 个 Builder 类
不可变,线程安全不适合参数极少或极多的极端场景
可在 build() 里集中校验

Lombok 一行搞定

@Builder
public class User {private final String name;private final int age;private final String phone;
}

使用框架

系统源码级(AOSP 自带)

典型链式调用说明
AlertDialog.Buildernew Builder(context).setTitle(..).setPositiveButton(..).show()官方最经典示例

主流三方库(日常必用)

建造者入口场景
OkHttpnew OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).build()网络参数多
Retrofitnew Retrofit.Builder().baseUrl("https://api.xxx/").addConverterFactory(..).build()接口配置
GlideGlide.with(this).load(url).placeholder(R.drawable.loading).into(imageView)图片加载链式 DSL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95721.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页计时器,支持多计时器管理、数据分享、用户数据同步、全屏展示等功能,可进行倒计时、正计时和显示世界时钟。

一个具有现代化 UI 和交互的计时器网页应用&#xff0c;支持多计时器管理、数据分享、用户数据同步、全屏展示等功能&#xff0c;可进行倒计时、正计时和显示世界时钟。它采用玻璃态设计和流畅动画效果&#xff0c;提供极佳的视觉体验。 特点&#xff1a; 支持多个计时器的创建…

纹理融合——用 TypeScript + Babylon.js 打造“可混合纹理序列”

我不想搞个一新的Shader&#xff0c;我就想用已有的材质&#xff08;比如StandardMaterial和PBRMetallicRoughnessMaterial&#xff09;实现纹理融合渐变等效果&#xff0c;于是我搞了一个TextureBlender。一、为什么重复造轮子&#xff1f;GPU 插值受限material.diffuseTextur…

【完整源码+数据集+部署教程】公交车部件实例分割系统源码和数据集:改进yolo11-fasternet

背景意义 随着城市化进程的加快&#xff0c;公共交通系统的需求日益增加&#xff0c;公交车作为城市交通的重要组成部分&#xff0c;其运行效率和安全性直接影响到城市的交通状况和居民的出行体验。因此&#xff0c;公交车的维护和管理显得尤为重要。在这一背景下&#xff0c;公…

【C++题解】关联容器

关于set&#xff0c;map以及变种 |关联容器| set&multiset | map&multimap |无序关联容器| Unordered set&multiset | Unordered map&multimap | 建议先了解之后再配合练习 这次练习CCF真题比较多&#xff0c;也比较基础&#xff0c;预计耗时不用这么久。 今天…

【智谱清言-GLM-4.5】StackCube-v1 任务训练结果不稳定性的分析

1. Prompt 我是机器人RL方向的博士生正在学习ManiSkill&#xff0c;在学习时我尝试使用相同命令训练同一个任务&#xff0c;但是我发现最终的 success_once 指标并不是相同的&#xff0c;我感到十分焦虑&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id&qu…

MySQL 8.0 主从复制原理分析与实战

MySQL 8.0 主从复制原理分析与实战半同步复制设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的基于全局事务标识符&#xff08;GTID&#xff09;复制GTID工作原理多主模式多主模式部署示例课程目标&#xff1a; MySQL 复制&#xff08;Replication&a…

[UT]记录case中seq.start(sequencer)的位置变化带来的执行行为的变化

现象&#xff1a; 代码选择打开57行&#xff0c;注释掉60行执行&#xff0c;结果58行不会打印。 代码选择打开60行&#xff0c;注释57行执行&#xff0c;结果58行正常打印。 sequence的执行需要时间&#xff01;&#xff01;&#xff01; SV中代码57行切换到60行的区别&#xf…

利用keytool实现https协议(生成自签名证书)

利用keytool实现https协议&#xff08;生成自签名证书&#xff09;什么是https协议&#xff1f;https&#xff08;安全超文本传输协议&#xff09;是 HTTP 的安全版本&#xff0c;通过 SSL/TLS 加密技术&#xff0c;在客户端&#xff08;如浏览器&#xff09;和服务器之间建立加…

拆解 AI 大模型 “思考” 逻辑:从参数训练到语义理解的核心链路

一、引言&#xff1a;揭开 AI 大模型 “思考” 的神秘面纱​日常生活中的 AI 大模型 “思考” 场景呈现&#xff08;如 ChatGPT 对话、AI 写作辅助、智能客服应答&#xff09;​提出核心问题&#xff1a;看似具备 “思考” 能力的 AI 大模型&#xff0c;其背后的运作逻辑究竟是…

element plus 使用细节 (二)

接上一篇文章&#xff1a; element plus 使用细节 最近菜鸟忙于系统开发&#xff0c;都没时间总结项目中使用的问题&#xff0c;幸好还是在空闲之余总结了一点&#xff08;后续也会来补充&#xff09;&#xff0c;希望能给大家带来帮助&#xff01; 文章目录table fixed 的 v…

【机器学习学习笔记】numpy基础2

零基础小白的 NumPy 入门指南如果你想用电竞&#xff08;打游戏&#xff09;的思路理解编程&#xff1a;Python 是基础操作键位&#xff0c;而 NumPy 就是 “英雄专属技能包”—— 专门帮你搞定 “数值计算” 这类复杂任务&#xff0c;比如算游戏里的伤害公式、地图坐标&#x…

从自动化到智能化:家具厂智能化产线需求与解决方案解析

伴随着工业4.0浪潮和智能制造技术的成熟&#xff0c;家具行业正逐步从传统的自动化生产迈向智能化生产。智能化产线的构建不仅可以提升生产效率&#xff0c;还能满足个性化定制和柔性制造的需求。本文以某家具厂为例&#xff0c;详细解析智能化产线的核心需求&#xff0c;并提出…

macOS下基于Qt/C++的OpenGL开发环境的搭建

系统配置 MacBook Pro 2015 Intel macOS 12Xcode 14 Qt开发环境搭建 Qt Creator的下载与安装 在Qt官网的下载页面上下载&#xff0c;即Download Qt Online Installer for macOS。下载完成就得到一个文件名类似于qt-online-installer-macOS-x64-x.y.z.dmg的安装包。 下一步 …

当液态玻璃计划遭遇反叛者:一场 iOS 26 界面的暗战

引子 在硅谷的地下代码俱乐部里&#xff0c;流传着一个关于 “液态玻璃” 的传说 —— 那是 Apple 秘密研发的界面改造计划&#xff0c;如同电影《变脸》中那张能改变命运的面具&#xff0c;一旦启用&#xff0c;所有 App 都将被迫换上流光溢彩的新面孔。 而今天&#xff0c;我…

探究Linux系统的SSL/TLS证书机制

一、SSL/TLS证书的基本概念 1.1 SSL/TLS协议简介 SSL/TLS是一种加密协议&#xff0c;旨在为网络通信提供机密性、完整性和身份验证。它广泛应用于HTTPS网站、电子邮件服务、VPN以及其他需要安全通信的场景。SSL&#xff08;安全套接字层&#xff09;是TLS&#xff08;传输层安全…

python和java爬虫优劣对比

Python和Java作为爬虫开发的两大主流语言&#xff0c;核心差异源于语法特性、生态工具链、性能表现的不同&#xff0c;其优势与劣势需结合具体场景&#xff08;如开发效率、爬取规模、反爬复杂度&#xff09;判断。以下从 优势、劣势、适用场景 三个维度展开对比&#xff0c;帮…

Unity 枪械红点瞄准器计算

今天突然别人问我红点瞄准器在镜子上如何计算&#xff0c;之前的吃鸡项目做过不记得&#xff0c;今天写个小用例整理下。 主体思想记得是目标位置到眼睛穿过红点瞄准器获取当前点的位置就可以。应该是这样吧&#xff0c;&#xff1a;&#xff09; 武器测试结构 首先整个结构&am…

题解 洛谷P13778 「o.OI R2」=+#-

文章目录题解代码居然没有题解&#xff1f;我来写一下我的抽象做法。 题解 手玩一下&#xff0c;随便画个他信心的折线图&#xff0c;如下&#xff1a; 可以发现&#xff0c;如果我们知道终止节点&#xff0c;那么我们就可以知道中间有多少个上升长度。&#xff08;因为它只能…

RTSP流端口占用详解:TCP模式与UDP模式的对比

在音视频传输协议中&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff0c;实时流传输协议&#xff09;被广泛用于点播、直播、监控等场景。开发者在实际部署或调试时&#xff0c;常常会遇到一个问题&#xff1a;一路 RTSP 流到底占用多少个端口&#xff1f; 这…

websocket的key和accept分别是多少个字节

WebSocket的Sec-WebSocket-Key是24字节&#xff08;192位&#xff09;的Base64编码字符串&#xff0c;解码后为16字节&#xff08;128位&#xff09;的原始随机数据&#xff1b;Sec-WebSocket-Accept是28字节&#xff08;224位&#xff09;的Base64编码字符串&#xff0c;解码后…