類有多個可選參數的解決方案:程序員
1. 重疊構造器模式可行,可是當有許多參數的時候,客戶端代碼會很難編寫,而且仍然較難以閱讀。安全
2. JavaBeans模式,調用一個無參構造器來創造對象,而後調用setter方法來設置每一個必要的參數,以及每一個相關的可選參數。ui
缺點:構造過程被分到了幾個調用中,在構造過程當中JavaBean可能處於不一致的狀態。阻止了把類作成不可變的可能,須要程序員確保線程安全。this
3. Builder模式,模擬了具名的可選參數。spa
模式 | 優 | 劣 |
重疊構造器 | 寫法最簡單 | 多參數時候難讀、難寫、難用 |
JavaBeans | 建立實例簡單 | 構造過程可能不一致 |
Builder | 多參數時候易寫、易讀線程 構造過程一致code |
建立構建器有開銷 |
// Builder模式示例 public class NutritionFacts { private final int servingSize; // 必選參數 private final int servings; // 必選參數 private final int fat; // 可選參數 private final int sodium; // 可選參數 public static class Builder { private final int servingSize; private final int servings; private int fat = 0; private int sodium = 0; public Builder(int servingSize, int servings) { this.servingSize = servingSize; this.servings = servings; } public Builder fat(int val) { fat = val; return this; } public Builder sodium(int val) { sodium = val; return this; } public NutritionFacts build() { return new NutritionFacts(this); } } private NutritionFacts(Builder builder) { servingSize = builder.servingSize; servings = builder.servings; fat = builder.fat; sodium = builder.sodium; } }
// 調用 NutritionFacts coca = new NutritionFacts.Builder(240, 8).fat(5).build();
Java中傳統的抽象工廠實現是Class對象,用newInstance方法充當build方法的一部分。然而newInstance方法老是企圖調用類的無參構造器,可是有的類沒有無參構造器,這時也不會收到編譯時錯誤。Class.newInstance破壞了編譯時的異常檢查。對象