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 |