枚舉工廠表示形式

話不多說,直接上代碼:

/**
 * 枚舉工廠第一種表示形式
 */
public enum CarFactory {
	FordCar, BuickCar;
	public Car create() {
		switch (this) {
		case FordCar:
			return new FordCar();
		case BuickCar:
			return new BuickCar();
		default:
			throw new AssertionError("無效參數");
		}
	}
}
/**
 * 枚舉工廠第二種表示形式
 */
enum CarFactory2 {
	FordCar {
		public Car create() {
			return new FordCar();
		}
	}, 
	BuickCar {
		public Car create() {
			return new BuickCar();
		}
	};
	public abstract Car create();
}
interface Car {
}
class FordCar implements Car {
}
class BuickCar implements Car {
}

選自:《編寫高質量代碼 改善Java程序的151個建議》


總結優點:

1.避免錯誤調用的發生

         一般工廠方法模式中產生方法(也就是createcar方法)可以接受三種類型的參數:類型參數、String參數(產生方法中判斷String參數是需要產生什麼產品)、int參數(根據int值判斷需要生產什麼類型的產品),這三種參數都是寬泛的數據類型,很容易產生錯誤(比如邊界值問題、null值問題),而且出現這類錯誤編輯器還不會報警。而使用枚舉類型的工廠方法模式就不存在該問題了。不需要傳遞任何參數,只需要選擇好生產什麼類型的產品即可。

2.性能好,使用便捷

         枚舉類型的計算是以int類型的計算爲基礎的,這是最基本的操作,性能當然會快,至於使用便捷,注意看客戶端的調用,代碼的字面意思就是“汽車工廠,我需要一輛別克汽車,趕快生產”。

3.降低類間耦合

         不管生產方法接收的是Class、String還是int 的參數,都會成爲客戶端類的負擔,這些類並不是客戶端需要的,而是因爲工廠方法的限制必須輸入的,例如Class參數,對客戶端main方法來說,它需要傳遞一個FordCar.class參數才能生產一輛福特汽車,除了在create 方法中傳遞該參數外,業務類不需要改Car的實現類,這嚴重違背了迪米特原則(Law of Demeter ,簡稱 LoD),也就是最少知識原則:一個對象應該對其他對象有最少的瞭解。

         而枚舉類型的工廠方法就沒有這種問題了,它只需要依賴工廠類就可以生成一輛符合接口的汽車,完全可以無視具體汽車類的存在。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章