高效Java之使用靜態工廠方法替代構造方法

優點

1、 與構造方法不同,靜態方法擁有名字

     例如返個可能爲素數的BigInteger的構造方法BigInteger(int, int, Random)可以更好的表示爲BigInteger.probablePrime的靜態工廠方法(不是很明白這個方法的作用)。

    在類中似乎需要具有相同簽名的多個構造方法的情況下,用靜態工廠方法替換構造方法,並仔細選擇名稱來突出他們的差異。

2、 不需要每次調用都創建一個新對象

   允許不可變類使用預先構建的實例,並反覆分配他們以避免創建不必要的重複對象。Boolean.valueof(boolean)方法演示了這個模式的優點。這種類也被稱爲實例控制類(instance-controlled)

3、 可以返回其返回類型的任何子類對象

    這種靈活性的一個一個應用是API可以返回對象而不需要公開他的類,這種方式隱藏實現類會使API非常緊湊,這種技術使用於基於接口的框架。

    在Java 8之前,接口不能有靜態方法。從Java8要求所有接口的靜態成員都是公共的,Java9允許私有靜態方法、但靜態字段和靜態成員類仍然需要公開;Java集合框架有45個接口的實用工具實現,提供不可修改的集合、同步集合等等。大多是這些工具類都是隱藏的,不可實例化的Collections稱爲他們的夥伴類(companion class)

4、 返回對象的類可以根據輸入參數的不同而不同。

  可以返回任何聲明類型的子類

   EnumSet類沒有公共構造方法,只有靜態工廠,根據傳入枚舉值的數量返回set的類型(當類型少於65個時,每個枚舉值只佔長整型的一位,位置根據枚舉值在類中的序列數決定(ordinal)),大多數枚舉值都少於64個,這樣會非常節省資源

5、 在編寫包含該方法的類時,返回的對象的類不需要存在(基於接口設計)

   這種方式構成了服務提供者框架的基礎:服務接口、註冊API,功能API中大多都由靜態成員來保存數據、實現功能。

例如JDBC中 connection是服務接口的一部分,DeriverMananger.registerDriver提供註冊API,DeriverManager.getConnection是服務訪問API

缺點 

1、 未提供公共或受保護構造方法的類不能被子類化

2、 靜態工廠方法比構造方法更容易被人忽略

 

 

 

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