外观
一句话答案
Builder 模式分步构建复杂对象,链式调用设置属性,build() 生成最终不可变对象,Lombok @Builder 自动生成。
核心要点
建造者模式将复杂对象的构建过程与其表示分离,允许通过相同的构建过程创建不同的表示。
典型使用场景:
- 对象有大量可选参数(构造函数参数超过 4 个)
- 对象的构建步骤有固定顺序
- 需要创建不可变对象
现代 Java 中最常见的 Builder 写法(链式调用):
java
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();Lombok 简化版:
java
@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();Builder vs Factory 的区别:
| 维度 | Builder 模式 | Factory 模式 |
|---|---|---|
| 关注点 | 构建过程——怎么一步步组装 | 创建结果——创建哪种产品 |
| 产品复杂度 | 适合复杂对象(多属性、多步骤) | 适合简单对象或产品族 |
| 构建步骤 | 可控制构建顺序,支持可选参数 | 一步到位,无中间构建状态 |
| 典型场景 | StringBuilder、Protobuf Message | BeanFactory、Calendar.getInstance() |
Java/框架中的 Builder 实例:
StringBuilder/StringBufferStream.builder()OkHttpClient.BuilderLombok @Builder
追问与易错
追问方向:
- Builder 和工厂区别?
- Lombok @Builder 原理?
- 链式调用和 Builder 一样吗?
易错点:
- ❌ Builder 就是为了链式调用——核心是分步构建
- ❌ 简单对象也用 Builder——参数少时构造器更简洁
💡 记忆锚点
点奶茶模式:先选必选项(茶底、杯型)再加可选配料(珍珠、椰果、少糖),最后一键下单build()出杯。参数超过4个就该用Builder,别让构造函数变成十几个参数的灾难现场。