面试知识库
基础

建造者模式#

一句话答案#

Builder 模式分步构建复杂对象,链式调用设置属性,build() 生成最终不可变对象,Lombok @Builder 自动生成。

核心要点

建造者模式将复杂对象的构建过程与其表示分离,允许通过相同的构建过程创建不同的表示。

典型使用场景:

  • 对象有大量可选参数(构造函数参数超过 4 个)
  • 对象的构建步骤有固定顺序
  • 需要创建不可变对象

现代 Java 中最常见的 Builder 写法(链式调用):

Lombok 简化版:

@Builder
@Data
public class User {
    private String name;
    private String email;
    private int age;
    private String phone;
}
// 使用
User user = User.builder().name("张三").email("zs@test.com").build();
java

Builder vs Factory 的区别:

维度Builder 模式Factory 模式
关注点构建过程——怎么一步步组装创建结果——创建哪种产品
产品复杂度适合复杂对象(多属性、多步骤)适合简单对象或产品族
构建步骤可控制构建顺序,支持可选参数一步到位,无中间构建状态
典型场景StringBuilderProtobuf MessageBeanFactoryCalendar.getInstance()

Java/框架中的 Builder 实例:

  • StringBuilder / StringBuffer
  • Stream.builder()
  • OkHttpClient.Builder
  • Lombok @Builder
面试回答(2分钟版)

建造者模式的核心思想是将复杂对象的构建过程与表示分离,通过链式调用分步设置属性,最后调用 build() 生成最终对象。它主要解决的是构造函数参数过多的问题——当一个对象有十几个属性,其中很多是可选的,用构造函数或 setter 都不够优雅。Builder 模式让必选参数放在 Builder 构造函数里,可选参数通过链式方法设置,既清晰又能保证对象创建后的不可变性。和工厂模式的区别在于:工厂关注的是创建哪种产品,一步到位;Builder 关注的是怎么一步步组装复杂产品。Java 里典型的 Builder 有 StringBuilder、OkHttpClient.Builder、Stream.builder()。实际开发中我们常用 Lombok 的 @Builder 注解自动生成 Builder 代码,省去手写的样板代码。经验上看,当一个类的构造参数超过四个,尤其有很多可选参数时,就应该考虑用 Builder 模式了。

追问与易错

追问方向:

  • “Builder 和工厂区别?”→ Builder 关注构建过程(怎么一步步组装复杂对象),支持可选参数和构建顺序;工厂关注创建结果(创建哪种产品),一步到位不关心构建细节
  • “Lombok @Builder 原理?”→ 编译时 APT 注解处理器自动生成内部 Builder 类、链式 setter 方法和 build() 方法,本质是在字节码层面插入代码,运行时无额外开销
  • “链式调用和 Builder 一样吗?”→ 不一样,链式调用(Fluent API)只是 return this 的语法糖,Builder 模式的核心是分步构建 + 最终生成不可变对象,链式调用只是 Builder 常用的实现手段之一

易错点:

  • ❌ Builder 就是为了链式调用——核心是分步构建
  • ❌ 简单对象也用 Builder——参数少时构造器更简洁