Java代碼設計思想之靜態工廠方法..

靜態工廠方法:
        創建類的實例的最常見的方式是用new語句調用類的構造方法。在這種情況下,程序可以創建類的任意多個實例,每執行一條new語句,都會導致Java虛擬機的堆區中產生一個新的對象。假如類需要進一步封裝創建自身實例的細節,並且控制自身實例的數目,那麼可以提供靜態工廠方法。

        例如Class實例是Java虛擬機在加載一個類時自動創建的,程序無法用new語句創建java.lang.Class類的實例,因爲Class類沒有提供public類型的構造方法。爲了使程序能獲得代表某個類的Class實例,在Class類中提供了靜態工廠方法forName(String name),它的使用方式如下:

        Class c=Class.forName("Sample"); //返回代表Sample類的實例

        靜態工廠方法與用new語句調用的構造方法相比,有以下區別。

      (1)構造方法的名字必須與類名相同。這一特性的優點是符合Java語言的規範,缺點是類的所有重載的構造方法的名字都相同,不能從名字上區分每個重載方法,容易引起混淆。靜態工廠方法的方法名可以是任意的,這一特性的優點是可以提高程序代碼的可讀性,在方法名中能體現與實例有關的信息。例如Gender類有兩個靜態工廠方法。

這一特性的缺點是與其他的靜態方法沒有明顯的區別,使用戶難以識別類中到底哪些靜態方法專門負責返回類的實例。爲了減少這一缺點帶來的負面影響,可以在爲靜態工廠方法命名時儘量遵守約定俗成的規範,當然這不是必需的。目前比較流行的規範是把靜態工廠方法命名爲valueOf或者getInstance。

   valueOf:該方法返回的實例與它的參數具有同樣的值,例如:

   Integer a=Integer.valueOf(100); //返回取值爲100的Integer對象

   從上面代碼可以看出,valueOf()方法能執行類型轉換操作,在本例中,把int類型的基本數據轉換爲Integer對象。

   getInstance:返回的實例與參數匹配,例如:

   //返回符合中國標準的日曆

   Calendar cal=Calendar.getInstance(Locale.CHINA);

   (2)每次執行new語句時,都會創建一個新的對象。而靜態工廠方法每次被調用的時候,是否會創建一個新的對象完全取決於方法的實現。

   (3)new語句只能創建當前類的實例,而靜態工廠方法可以返回當前類的子類的實例,這一特性可以在創建鬆耦合的系統接口時發揮作用。

    靜態工廠方法最主要的特點是:每次被調用的時候,不一定要創建一個新的對象。利用這一特點,靜態工廠方法可用來創建以下類的實例。

        單例類:只有惟一的實例的類。

        枚舉類:實例的數量有限的類。

        具有實例緩存的類:能把已經創建的實例暫且存放在緩存中的類。

        具有實例緩存的不可變類:不可變類的實例一旦創建,其屬性值就不會被改變。

 

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