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

Builder 设计模式

Builder 设计模式详解(面试可用)

一、什么是 Builder 模式?

Builder 模式(建造者模式) 是一种创建型设计模式,用于将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建出不同的表示。

🎯 核心思想:将复杂对象的构建步骤封装起来,用户无需关心内部细节,只需按步骤“组装”即可得到最终对象。


二、为什么需要 Builder 模式?

传统对象创建的痛点

假设有一个 Computer 类,有很多可选参数:

public class Computer {private String cpu;private String ram;private String storage;private String gpu;private String monitor;// 构造函数参数爆炸!
}

如果使用构造函数或 setter:

方式问题
多个构造函数参数爆炸(telescoping constructor)
全参构造函数必须传所有参数,即使有些为 null
setter 方式对象状态不一致(先 new 再 set,中间状态无效)

三、Builder 模式的解决方案

使用 Builder 模式重构

public class Computer {private final String cpu;private final String ram;private final String storage;private final String gpu;private final String monitor;// 私有构造函数,由 Builder 构建private Computer(Builder builder) {this.cpu = builder.cpu;this.ram = builder.ram;this.storage = builder.storage;this.gpu = builder.gpu;this.monitor = builder.monitor;}// 静态内部类 Builderpublic static class Builder {private String cpu;private String ram;private String storage;private String gpu;private String monitor;public Builder cpu(String cpu) {this.cpu = cpu;return this; // 返回 this 实现链式调用}public Builder ram(String ram) {this.ram = ram;return this;}public Builder storage(String storage) {this.storage = storage;return this;}public Builder gpu(String gpu) {this.gpu = gpu;return this;}public Builder monitor(String monitor) {this.monitor = monitor;return this;}// 构建最终对象public Computer build() {return new Computer(this);}}
}

使用方式(链式调用)

Computer computer = new Computer.Builder().cpu("i7").ram("16GB").storage("512GB SSD").gpu("NVIDIA RTX 3060").monitor("27 inch").build(); // 最后 build() 返回完整对象

四、Builder 模式的核心角色

角色说明
Product(产品类)要创建的复杂对象,如 Computer
Builder(抽象建造者)定义创建产品各个部件的抽象接口(可选,接口形式)
ConcreteBuilder(具体建造者)实现 Builder 接口,具体实现各个部件的构建逻辑(如 Computer.Builder)
Director(指挥者)调用 Builder 的方法,按顺序构建产品(在 Java 中常省略,由客户端直接调用)

在 Java 中,通常使用 静态内部类 Builder,省略 Director,由客户端直接链式调用。

五、Builder 模式的优势

优点说明
链式调用,代码清晰.xxx().yyy().zzz().build() 风格,易于阅读
对象不可变(Immutable)通过 final 字段和私有构造函数实现,线程安全
避免参数爆炸不用写多个构造函数
可选参数灵活只设置需要的字段,其余可为 null 或默认值
构建过程可控可在 build() 方法中进行参数校验

六、实际应用场景

1. Java 标准库中的 Builder 模式

// StringBuilder
new StringBuilder().append("Hello").append(" ").append("World").toString();// Stream
list.stream().filter(x -> x > 0).map(x -> x * 2).collect(Collectors.toList());// HttpClient(Java 11+)
HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build();

2. Lombok 注解自动生成 Builder

@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {private Long id;private String name;private Integer age;
}// 使用
User user = User.builder().name("Alice").age(25).build();

七、与工厂模式的区别

比较项工厂模式Builder 模式
目的创建对象构建复杂对象
对象复杂度简单或中等复杂,多参数
是否链式调用
是否支持可选参数有限灵活
是否不可变对象是(推荐)

简单对象用工厂,复杂对象用 Builder。

八、面试回答模板(简洁版)

“Builder 模式是一种创建型设计模式,用于构建复杂对象。它通过一个内部 Builder 类,提供链式调用的方式设置对象属性,最后调用 build() 方法生成不可变对象。优点是避免构造函数参数爆炸、支持可选参数、代码可读性强。典型应用有 StringBuilder、Lombok @Builder、Android AlertDialog.Builder 等。适用于参数多、需要灵活配置的场景。”

九、总结

特性说明
模式类型创建型
核心目的分离复杂对象的构建与表示
关键特征链式调用、不可变对象、build() 方法
适用场景对象构造参数多、部分参数可选、希望对象不可变
Java 典型应用StringBuilder、HttpClient.newBuilder()、Lombok @Builder

十、自定义 Builder 和 lombok 中 Builder 的对比

对比维度自定义 Builder(手动编写)Lombok @Builder
实现方式手动编写所有代码编译时通过注解处理器自动生成代码
代码量非常多(样板代码)极少(一个注解)
维护成本高(增删改字段需同步修改 Builder 代码)极低(只需修改字段,Builder 自动更新)
灵活性完全可控,可实现复杂逻辑受限于 Lombok 提供的功能
可读性(源码)源码清晰,逻辑一目了然源码简洁,但生成的代码不可见
依赖无外部依赖需要引入 Lombok 依赖和 IDE 支持
调试直接,可断点调试 Builder 代码间接,调试的是生成的字节码

十一、 什么时候自定义 Builder ?

  • 构建过程需要复杂的业务逻辑、验证或状态转换。
  • 你对构建过程有非常精细的控制需求。
  • 你的项目不允许引入 Lombok 这样的字节码操作库(例如,某些严格的生产环境或遗留系统)。
  • 你需要完全透明的代码,不希望有任何位置情况发生
http://www.dtcms.com/a/507676.html

相关文章:

  • 重庆永川网站建设报价什么网站必须要flash
  • 接口自动化测试概念
  • 嵌入式软件中负数如何存储
  • 【运维心得】bitlocker未解之谜:34.3%的诅咒
  • AUTOSAR图解==>AUTOSAR_AP_TR_DDSSecurityIntegration
  • 何超携Iman新马宣传 新片《拾荒法师2》将开拍
  • 实体-联系(E-R)模型
  • 网站开发的调研内容小程序制作方案书
  • 『 QT 』QT控件属性全解析 (一)
  • 临床研究标志物发现与机制探索:纯数据挖掘与“实验+服务”一站式方案,如何选择?
  • 辽宁省网站制作网站建站对象
  • 使用 PyQt5 和 PIL 打造 GIF 圆角处理工具
  • (一).Net, NextJS(微服务同步通讯/Polly/RabbitMQ/Outbox/死信队列处理)
  • 长治网站设计制作网站网站安全设计
  • 腐烂的橘子——LEGB 作用域规则
  • [Linux系统编程——Lesson16.Ext系列⽂件系统]
  • 长尾关键词优化在SEO策略中的重要性与实践技巧
  • 邯郸形象网站建设广州网络推广建站
  • 品牌网站模板速卖通导入WordPress
  • 深入理解 Dubbo 的 ServiceConfig:服务粒度的配置机制
  • 开源 Linux 服务器与中间件(六)服务器--Lighttpd
  • 数据结构——排序的学习(一)
  • 服务器的安全性如何?
  • 新奇特:神经网络速比器,小镇债务清零的算法奇缘
  • 阿里云 OSS MetaQuery 全面升级——新增内容和语义的检索能力,助力 AI 应用快速落地
  • Deepseek新模型Deepseek-OCR, 不仅仅是OCR
  • 重庆网站制作机构怎么建立自己企业网站
  • 律师网站 扁平化扁平化网站 源代码
  • 解耦的艺术:深入理解设计模式之命令模式
  • C# 设计模式——工厂模式