Java程式碼優化:靜態工廠方法 Static Factory Method
阿新 • • 發佈:2018-12-26
Effective Java中提出了靜態工廠,即不使用產品的constructor來提供產品,靜態工廠不是開發模式,而是一種改進提供例項的策略。
如何實現?
很簡單,靜態工廠方法的定義是:一個返回類的例項的靜態方法
這樣做有什麼好處?
1)靜態工廠方法簽名可讀性強,封裝了不必要的引數,減少了使用錯誤。
2)靜態工廠方法不需要每次都new一個物件,可以取得預載或快取物件
3)靜態工廠方法可以返回物件的任意子類。
4)靜態工廠的返回型別可以按照引數變化
5)靜態工廠返回的物件可以推遲到執行時例項化,實現物件和使用者之間的解耦。
5個優點即是不使用靜態工廠方法會遇到的5個缺點:
假設我們有一個手機產品有三種顏色紅/黃/黑,我們傳統獲取例項的模式可能是下面這樣,new產品物件。
String color = "red";
Phone redPhone = new Phone(color);
Phone的建構函式可能是這樣的:
private String color;
/*
* 判斷顏色,紅/黃/黑就初始化手機顏色,規定顏色以外就預設手機是黑色
*/
public Phone(String color){
//按條件初始化this.color
}
1)使用者要取得特定的Phone,必須知道構造引數的意義,如果引數增多,使用者容易犯錯!使用體驗就是失敗的。
2)使用者每次取得手機都new一個Phone,對不可變類或檢視場景下浪費資源。
3)使用者無法通過Phone作為介面去獲取下屬產品的資訊和功能,比如蘋果和安卓,只能另外去找蘋果和安卓的手機介面。
4)輸入相同型別的構造引數,返回型別只能相同。
5)使用Phone功能前,先建立例項,而不是需要使用功能時才建立例項。
注:這裡的“使用者"可以指Phone的被依賴類
然而用靜態方法呼叫例項可能是這樣的
Phone redPhone = Phone.getRedPhone();
Phone的建構函式多了幾個靜態方法,封裝了構造器
private String color;
/*
* 判斷顏色,紅/黃/黑就初始化手機顏色,規定顏色以外就預設手機是黑色
*/
private Phone(String color){
//按條件初始化this.color
}
public static Phone getRedPhone(){
return new Phone("Red");
}
public static Phone getBlackPhone(){
return new Phone("Black");
}
public static Phone getYellowPhone(){
return new Phone("Yellow");
}
取得手機不再依靠同一簽名的構造方法,並且限制了使用者的輸入錯誤。從而優化了取得例項的方式。
這種思路再進一步放到工廠模式上,並使用反射,就能實現2),3),4),5)的優點。