Builder模式

/**
 * 
 * @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

發佈了25 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章