話不多說,直接上代碼:
/**
* 枚舉工廠第一種表示形式
*/
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),也就是最少知識原則:一個對象應該對其他對象有最少的瞭解。
而枚舉類型的工廠方法就沒有這種問題了,它只需要依賴工廠類就可以生成一輛符合接口的汽車,完全可以無視具體汽車類的存在。