1. 程式人生 > >Java程式碼優化:靜態工廠方法 Static Factory Method

Java程式碼優化:靜態工廠方法 Static Factory Method

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)的優點。