Java中建立和銷燬對象(01)之建立對象-靜態工廠方法

考慮用靜態工廠方法代替構造器

Boolean類中,有這樣一個方法:java

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}
複製代碼

這就是JDK用靜態工廠方法代替構造器的一個使用。那麼這樣作有什麼好處呢?框架

  1. 靜態工廠方法有名稱,能夠明顯區分出不一樣構造方法的做用,構造器則體現不出來;
  2. 沒必要在每次調用它時都建立一個新對象。在靜態工廠方法中咱們能夠手動控制建立對象的個數。
  3. 靜態工廠方法能夠返回原返回類型的任何子類型的對象。能夠使返回的對象更加靈活。靜態工廠方法構成了服務者提供框架(Service Provider Framework)的基礎,例如JDBC API。服務者提供框架是指這樣一個系統:多個服務提供者實現一個服務,系統爲服務者提供者的客戶端實現多個實現,並把他們從多個實現中解耦出來。
  4. 在建立參數化類型實例的時候,他們使代碼變得更加簡潔。
    一般咱們在構造Map時,會這樣寫:Map<String, List<String>> m = new HashMap<String, List<String>>();,雖然在JDK7以後能夠簡化爲Map<String, List<String>> m = new HashMap<>();,但假設一下,若是HashMap提供了一個這樣的靜態工廠:
public static <K, V> HashMap<K, V> newInstance() {
  return HashMap<K, V>();
}
複製代碼

那麼在建立時就能夠寫爲:Map<String, List<String>> m = HashMap.newInstance();ide

靜態工廠方法並非沒有任何缺點的:spa

  1. 類若是不含公有的或受保護的構造器,就不能被子類化。
  2. 靜態工廠方法沒法與其餘的靜態方法區分。若是命名不規範,很容易被誤導。但咱們能夠用一些規範的命名來彌補這一劣勢,如 valueOfgetInstancenewInstancegetType 等。

總結:code

靜態工廠方法和構造器各有優劣。一般靜態工廠更合適,切忌第一反應就是提供公有的構造器,而不是優先考慮靜態工廠。對象

參考

《Effective Java中文版 第2版》get

相關文章
相關標籤/搜索