Java设计模式之创建型—建造者模式
Java中最常用的设计模式-CSDN博客
“把对象的构造步骤拆成链式方法,调用者按需填参,最后一次性 build,避免构造函数爆炸。”
-
经典场景
-
参数多(>4 个)且大部分可选
-
需要不可变对象(final 字段)
-
避免伸缩构造函数(telescoping constructor)
模板代码
public final class User {// ① 所有字段 final,不可变private final String name;private final int age;private final String phone;// ② 私有构造,只接受 Builderprivate User(Builder builder) {this.name = builder.name;this.age = builder.age;this.phone = builder.phone;}// ③ 静态内部 Builderpublic static class Builder {private String name; // 必填private int age = -1; // 可选默认值private String phone;public Builder(String name) { this.name = name; }public Builder age(int age) { this.age = age; return this; }public Builder phone(String p){ this.phone = p; return this; }public User build() {// 参数校验放这里if (age < 0) throw new IllegalArgumentException("age missing");return new User(this);}}// ④ Getter(无 Setter)public String name() { return name; }public int age() { return age; }public String phone() { return phone; }
}
客户端链式调用
User user = new User.Builder("Alice").age(18).phone("13800138000").build();
优点 | 缺点 |
可读性高,链式流畅 | 多写 1 个 Builder 类 |
不可变,线程安全 | 不适合参数极少或极多的极端场景 |
可在 build() 里集中校验 |
Lombok 一行搞定
@Builder
public class User {private final String name;private final int age;private final String phone;
}
使用框架
系统源码级(AOSP 自带)
类 | 典型链式调用 | 说明 |
AlertDialog.Builder | new Builder(context).setTitle(..).setPositiveButton(..).show() | 官方最经典示例 |
主流三方库(日常必用)
库 | 建造者入口 | 场景 |
OkHttp | new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).build() | 网络参数多 |
Retrofit | new Retrofit.Builder().baseUrl("https://api.xxx/").addConverterFactory(..).build() | 接口配置 |
Glide | Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView) | 图片加载链式 DSL |