靜態工廠方法構造對象優缺點

對於一個類,要獲取它的一個實例,通常的做法是提供一個公用的構造函數,然而還有另一種方法,我們稱之爲靜態工廠方法,實質上也就是一個簡單的靜態方法,它返回一個類的實例。其實,靜態工廠方法獲取對象實例,我們並不陌生,我們來看看API中的一個實例:

java.lang.Boolean類:

public static Boolean valueOf(boolean b){

       return (b ? TRUE : FALSE);

}

返回一個表示指定 boolean 值的 Boolean 實例。如果指定的 boolean 值爲 true,則此方法返回 Boolean.TRUE;如果爲 false,則返回 Boolean.FALSE。如果不需要新的 Boolean 實例,則應優先使用此方法,而不是構造方法 Boolean(boolean),因爲此方法有可能大大提高空間和時間性能

 

基於此,倒不如來探討一下使用靜態工廠方法獲取類的實例的優缺點

優點總結如下:

其一:與構造方法不同,它在被調用的時候,並不一定非得創建新的實例對象。它可以將一個預先創建好的實例緩存起來,當被調用時,就將此對象返回給客戶,從而避免創建不必要的重複對象。如果一個程序需要頻繁的創建相同的對象,並且創建對象的代價很昂貴,則這項技術可以極大的提高空間和時間性能。

其二:與構造方法不同,靜態工廠方法有更清晰的名稱表達。例如:BigInteger(int bitLength, int certainty, Random rnd) 它返回的可能是一個素數,然而使用一個如BigInteger.probablePrime的靜態工廠方法,表達顯然更加清晰。如果一個類,有多個構造方法,並且他們具有相同的原型特徵,那麼你應該考慮用靜態工廠的方法來代替一個或多個構造方法,並慎重的選擇它們的名字,以清晰的表達它們的不同。

其三:與構造方法不同,它可以返回一個原返回類型的一個子類對象。這樣,我們在選擇返回對象類型的時候就有了更大的靈活性。這種靈活性的一個應用時,一個API可以返回一個對象,同時又不使該對象的類成爲公有的。以這種方式將具體的實現類隱藏起來,可以得到一個簡潔的API。這項技術非常適用於基於接口的框架結構,因爲在這樣的框架結構中,接口成爲靜態工廠方法的自然返回類型。
缺點總結如下:

其一:類如果不提供公有的或受保護的構造方法,就不能被子類化。對於這一點,我還沒弄得太明白,我覺着這並非靜態工廠方法的一個缺點啊,如果一個類只提供了私有的構造方法,即使是通過構造方法也不能將其實例化啊。還望各位指教

其二:它與其他的靜態方法並沒有兩樣。它是對規範的一種背離

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