当前位置: 首页 > news >正文

Java设计模式-建造者模式

一句话记住
“把复杂对象拆成 字段-填充-组装 三个阶段,先指挥 Builder 按序 一步步建造,最后 一次性交付 一个 完整且不可变 的对象。”

一、为什么要用建造者模式?

设想你要组装一台“高配台式机”:

  • 机箱型号?CPU 型号?显卡?主板?电源?RGB?
  • 参数多、排列组合爆炸 → 构造器重载成几十种?
  • 必填与选填混杂,部分字段有顺序依赖 → 容易写出残次品对象。
  • 对象创建完应是不可变(Immutability),不允许二次 setXXX。

传统方案:

// 错误示范:重叠构造器 Telescoping Constructor
Computer c1 = new Computer("NZXT", "AMD 7950X",   null, null, null,null, null);  // 错填
Computer c2 = new Computer("ABCD", "Intel 13900K","ASUS","RTX4090",null,null, "Seasonic 850W");

建造者方案:

Computer pc = Computer.builder().cpu("AMD Ryzen 9 7950X").gpu("RTX 4090").ram("32G DDR5").build();

优点:

  • 可读性极高,接近自然语言 DSL。
  • 可选字段“不填也不会传 null”。
  • 复杂校验全部隐藏在 build() 里。
  • 生成的 Computer 无 setter,线程安全。

二、四种实现方式

版本场景JDK 支持不可变样板代码
传统 Builder 类所有 JDK自写
链式 setter仅可变性要求低自写极少
Lombok @Builder任何 >= 1.8Lombok 插件极少
Java 14+ record + BuilderJava ≥ 14语言支持

下面详细演示前两种,后两种给出关键代码片段。

三、传统 Builder 实现

1) 产品(Product)

public final class Computer {// 必传private final String cpu;// 可选private final String gpu;private final int ram;private final Storage storage;private final boolean hasRGB;// 私有 ctor:只能是 Builder 调用private Computer(Builder b) {this.cpu   = b.cpu;this.gpu   = b.gpu;this.ram   = b.ram;this.storage = b.storage;this.hasRGB = b.hasRGB;}public static Builder builder() {return new Builder();}@Overridepublic String toString() {return "Computer{cpu=" + cpu + ", gpu=" + gpu + ", ram=" + ram + "G}";}// ========= Builder 内部类 =========public static class Builder {// 必填字段在 Builder 中仍须初始 dummy,或 build 时检查private String cpu;   // 非 nullprivate String gpu;private int ram = 8;  // 默认值private Storage storage = new Storage("SSD", 512);private boolean hasRGB;public Builder cpu(String cpu) {this.cpu = cpu;return this;         // 链式}public Builder gpu(String gpu) { this.gpu = gpu; return this; }public Builder ram(int ram)   { this.ram = ram; return this; }public Builder storage(String type, int size) {this.storage = new Storage(type, size);return this;}public Builder rgb(boolean flag) { this.hasRGB = flag; return this; }// 集中校验public Computer build() {Objects.requireNonNull(cpu, "CPU must not be null");if (ram < 4) throw new IllegalArgumentException("ram invalid");return new Computer(this);}}
}

2) 客户端代码

Computer pc = Computer.builder().cpu("Intel i9-14900K").ram(64).storage("PCIe4 NVMe", 2048).gpu("RTX 4090").rgb(true).build();
System.out.println(pc);

四、Lombok 极简版本

只需一个注解:

@Builder(toBuilder = true)
@Value  // = Immutable + getter + equals/hash/toString
public class Computer {String cpu;String gpu;int ram;Storage storage;boolean hasRGB;
}Computer pc = Computer.builder().cpu("Ryzen").build();

@Value 生成的类 final,所有字段 final,无 setter,builder() 方法自动提供。

五、Java 14+ record + Builder

record 天生不可变,但缺少默认的 Builder。可手写一次,复用多次:

public record Computer(String cpu, String gpu, int ram,Storage storage, boolean hasRGB) {public static class Builder {// 省略同上}
}

六、与相近模式比较

  • 抽象工厂:返回 一组 相关对象(ProductA, ProductB),而 Builder 一步步构造一个复杂对象
  • 工厂方法:解决“哪种类来实例化”,Builder 解决“如何用复杂步骤拼好这个实例”。
  • 原型模式:通过克隆创建,Builder 是 从零建造
  • 装饰者:动态包装附加行为,Builder 静态地把字段锁定在构造期。

七、最佳实践小结

  1. 字段数 ≥ 4,且参数可选 → 优先考虑 Builder。
  2. 线程安全 → build() 之后对象不可变。
  3. Spring Boot @ConfigurationProperties 绑定支持 Builder:@ConstructorBinding + @Builder(Spring 2.2+)。
  4. 序列化 → 加 @Jacksonized(Lombok 1.18.14+)让 Jackson 也能用 Builder 反序列化 JSON。
  5. 分层架构 → Dozer / MapStruct 可自动从 DTO → Builder → Entity。

记住口诀:
多参构造真痛苦,建造者模式来相助;链式调用表义明,一敲 build 对象成。

http://www.lryc.cn/news/599759.html

相关文章:

  • Tomcat线程池深度优化指南:高并发场景下的maxConnections计算与监控体系
  • iOS 加固工具实战解析,主流平台审核机制与工具应对策略
  • iOS WebView 调试实战,文件上传与权限弹窗异常的排查路径
  • Win11批量部署神器winget
  • 【通识】算法案例
  • Python--文件操作
  • MYSQL高可用集群搭建--docker
  • Kingbasepostgis 安装实践
  • 电子电气架构 --- 车载软件与样件产品交付的方法
  • 华为昇腾NPU卡 文生音频[T2A]大模型suno/bark模型推理使用
  • 线性代数 上
  • 旧物回收系统开发:搭建资源再生与环保共赢的桥梁
  • AMD官网下载失败,不让账户登录下载
  • STM32-中断配置教程(寄存器版)
  • 设计模式十:单件模式 (Singleton Pattern)
  • 《设计模式之禅》笔记摘录 - 10.装饰模式
  • 一道检验编码能力的字符串的题目
  • C# WPF 实现读取文件夹中的PDF并显示其页数
  • 《Angular+Spring Boot:ERP前端采购销售库存协同架构解析》
  • Qt 数据库事务处理与数据安全
  • Orbbec开发---数据流与数据流操作
  • 输电线路观冰精灵在线监测装置:科技赋能电网安全的新利器
  • 智慧灯杆:不止于照明,塔能科技的城市感知网络野心
  • 微算法科技(NASDAQ:MLGO)采用分布式哈希表优化区块链索引结构,提高区块链检索效率
  • C 语言 | 结构体详解:自定义数据类型的艺术
  • 现代 C++ 开发工作流(VSCode / Cursor)
  • 多场景通用车辆计数算法助力暑期交通管理
  • 【质量管理】软件缺陷管理实施方案(专业版)
  • 华为网络整套架构常用配置
  • cacti漏洞CVE-2022-46169复现