中 基础
建造者模式#
一句话答案#
Builder 模式分步构建复杂对象,链式调用设置属性,build() 生成最终不可变对象,Lombok @Builder 自动生成。
核心要点
建造者模式将复杂对象的构建过程与其表示分离,允许通过相同的构建过程创建不同的表示。
典型使用场景:
- 对象有大量可选参数(构造函数参数超过 4 个)
- 对象的构建步骤有固定顺序
- 需要创建不可变对象
现代 Java 中最常见的 Builder 写法(链式调用):
public class User {
private final String name; // 必选
private final String email; // 必选
private final int age; // 可选
private final String phone; // 可选
private User(Builder builder) {
this.name = builder.name;
this.email = builder.email;
this.age = builder.age;
this.phone = builder.phone;
}
public static class Builder {
private final String name;
private final String email;
private int age;
private String phone;
public Builder(String name, String email) {
this.name = name;
this.email = email;
}
public Builder age(int age) { this.age = age; return this; }
public Builder phone(String phone) { this.phone = phone; return this; }
public User build() { return new User(this); }
}
}
// 使用:链式调用,清晰易读
User user = new User.Builder("张三", "zs@test.com")
.age(25)
.phone("13800138000")
.build();javaLombok 简化版:
@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();javaBuilder vs Factory 的区别:
| 维度 | Builder 模式 | Factory 模式 |
|---|---|---|
| 关注点 | 构建过程——怎么一步步组装 | 创建结果——创建哪种产品 |
| 产品复杂度 | 适合复杂对象(多属性、多步骤) | 适合简单对象或产品族 |
| 构建步骤 | 可控制构建顺序,支持可选参数 | 一步到位,无中间构建状态 |
| 典型场景 | StringBuilder、Protobuf Message | BeanFactory、Calendar.getInstance() |
Java/框架中的 Builder 实例:
StringBuilder/StringBufferStream.builder()OkHttpClient.BuilderLombok @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——参数少时构造器更简洁