/**
*
* @author luoaz
*
*/
public class InstanceCanNotChange {
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 {
// Required parameters
private int servingSize;
private int servings;
// Optional parameters - initialized to default values
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 carbohydrte) {
this.carbohydrate = carbohydrte;
return this;
}
public InstanceCanNotChange builder() {
return new InstanceCanNotChange(this);
}
}
private InstanceCanNotChange(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;
}
}
優點:安全
與構造器相比,builder的微略優勢在於,builder可以有多個可變參數。構造器就像方法一樣,只能有一個可變參數。因爲builder利用單獨的方法來設置每個參數,你想要多少可變參數,它們就可以有多少個可變參數,直到每個setter方法都有一個可變參數。Builer模式十分靈活,可以利用單個builder構建多個對象。builder的參數可以在創建對象期間進行調整,也可以隨着不同的對象而改變。builder可以自動填充某些域,例如每次創建對象時增加序列號
缺點:builder模式也有它自身的不足。爲了創建對象,必須先創建它的構造器。雖然創建構建器的開銷在實踐中可能不是那麼明顯,但是在某些十分注重性能的情況下,可能就成問題了。Builder模式還比重疊構造器模式更加冗長,因此它只在有很多參數的時候才使用,比如4個或更多參數。但是記住,將來你可能需要添加參數。如果一開始就使用構造器或者靜態工廠,等到類需要多個參數時才添加構建器,就會無法控制,那些過時的構造器或者靜態工廠顯得十分不協調。因此,通常最好一開始就使用構建器
簡而言之:如果類的構造器或者靜態工廠中具有多個參數,設計這種類時,Builder模式就是種不錯的選擇,特別是當大多數參數都是可選的時候。與使用傳統的重疊構造器模式相比,使用Builder模式的客戶端代碼更易於閱讀和編寫,構造器也比JAVABEANS更安全。
摘抄自:Effective Java