Builder模式通过分离构造与表示解决参数过多、可读性差等问题,核心结构含final原始类、静态内部Builder类及链式方法,build()校验并返回不可变对象;Lombok的@Builder可自动生成简化代码。

Java 中用 Builder 模式创建复杂对象,核心是把对象的构造过程和表示分离,避免构造函数参数过多、可读性差或必须传 null 的问题。适合字段多、部分可选、有校验逻辑或需分步构建的场景。
Builder 模式的基本结构
通常包含三部分:原始类(一般设为 final)、静态内部 Builder 类、以及 Builder 中的链式方法。关键点是 Builder 负责收集参数,最后调用 build() 返回不可变对象。
- 原始类的构造器私有,只接受 Builder 实例(或所有字段)
- Builder 类提供 setXXX() 方法,每个都返回 this,实现链式调用
- build() 方法负责校验(如必填字段是否为空)、组装并返回最终对象
手写 Builder 的典型写法
以用户类为例:
public final class User {private final String name;
private final int age;
private final String email;
private final List
private User(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.email = builder.email;
this.roles = Collections.unmodifiableList(new ArrayList(builder.roles));
}
public static class Builder {
private String name;
private int age;
private String email;
private final List
public Builder name(String name) { this.name = name; return this; }
public Builder age(int age) { this.age = age; return this; }
public Builder email(String email) { this.email = email; return this; }
public Builder addRole(String role) { this.roles.add(role); return this; }
public User build() {
if (name == null || name.trim().isEmpty())
throw new IllegalStateException("name is required");
return new User(this);
}
}
}
使用时:
User user = new User.Builder().name("Alice").age(28).email("a@example.com").addRole("USER").build();
用 Lombok 简化 Builder
如果项目引入了 Lombok,只需加 @Builder 注解,编译期自动生成 Builder 类和方法,大幅减少样板代码:
立即学习“Java免费学习笔记(深入)”;
@Builderpublic final class User {
private final String name;
private final int age;
private final String email;
private final List
}
生成的 Builder 支持链式调用,也支持 @Builder.Default 设置默认值、@Singular 处理集合字段。若需校验,可配合 @Buildable 或自定义 build() 方法。
注意事项和常见改进
- Builder 本身不是线程安全的,不要复用同一个 Builder 实例构建多个对象
- 对集合类字段,Builder 中建议用新集合接收,避免外部修改影响最终对象
- build() 中做必要校验,但避免耗时操作(如网络请求、文件读取)
- 若对象字段极少(≤3 个且无选填),直接用构造函数更简洁,不必强行 Builder


















