如果一個(gè)類構(gòu)造器的參數(shù)大于四個(gè)就要考慮使用構(gòu)造器來構(gòu)建類了写半。它可以使參數(shù)更加靈活瞎嬉,擴(kuò)展性更好并且可以減少一些參數(shù)位置寫錯(cuò)的情況蜕琴。
可采用Builder模式的一種形式挣轨,不直接生成想要的對(duì)象串前,而是讓客戶端利用所有必要的參數(shù)調(diào)用構(gòu)造器(或靜態(tài)工廠)
得到一個(gè)builder對(duì)象瘫里。然后客戶端在builder對(duì)象上調(diào)用類似setter的方法,來設(shè)置每個(gè)相關(guān)的可選參數(shù)荡碾。最后谨读,客戶端調(diào)用無參的build方法來生成不可變的對(duì)象。這個(gè)builder是它構(gòu)建的類的靜態(tài)成員類坛吁。
示例:
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
private final int servingSize;
private final int servings;
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int calories) {
this.calories = calories;
return this;
}
public Builder fat(int fat) {
this.fat = fat;
return this;
}
public Builder sodium(int sodium) {
this.sodium = sodium;
return this;
}
public Builder carbohydrate(int carbohydrate) {
this.carbohydrate = carbohydrate;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
this.servingSize = builder.servingSize;
this.servings = builder.servings;
this.calories = builder.calories;
this.fat = builder.fat;
this.sodium = builder.sodium;
this.carbohydrate = builder.carbohydrate;
}
@Override
public String toString() {
return "NutritionFacts{" +
"servingSize=" + servingSize +
", servings=" + servings +
", calories=" + calories +
", fat=" + fat +
", sodium=" + sodium +
", carbohydrate=" + carbohydrate +
'}';
}
}
測(cè)試:
public class test {
public static void main(String[] args) {
NutritionFacts.Builder builder = new NutritionFacts.Builder(1, 2);
NutritionFacts nutritionFacts = builder.calories(3)
.carbohydrate(4)
.fat(5)
.sodium(6)
.build();
System.out.println(nutritionFacts.toString());
}
}
如果類的構(gòu)造器或者靜態(tài)工廠中具有多個(gè)參數(shù)劳殖,設(shè)計(jì)這種類時(shí),Builder模式就是種不錯(cuò)的選擇拨脉,特別是當(dāng)大多數(shù)參數(shù)都是可選的時(shí)候哆姻。與使用傳統(tǒng)的重疊構(gòu)造器的模式相比,使用Builder模式的客戶端代碼更易于閱讀和編寫玫膀,構(gòu)建器也比JavaBeans更加安全矛缨。
參考:《Effective Java》