【Practical API Design學習筆記】工廠方法因爲構造函數

緣由: java

一、工廠方法返回的實例不必定是該類的實例,能夠是它的子類的實例。可是構造函數只能new出該類的實例; 緩存

二、工廠方法建立的對象能夠緩存,以便下次使用,構造函數不能夠; 函數

三、對於同步的控制,工廠方法能夠將建立對象先後的代碼進行統一處理,構造函數就無能爲力了; this

四、工廠方法支持參數化返回類型,構造函數不支持。 設計

例如: code

在java1.5以前,咱們有如下代碼: 對象

public final class Template extends Object {
  private final Class type;
  public Template(Class type) { this.type = type; }
  public Class getType() { return type; }
  public Template() { this(Object.class); }
}
java1.5加入了泛型,所以,咱們改寫上面的代碼爲:
public final class Template<T> extends Object {
  private final Class<T> type;
  public Template(Class<T> type) { this.type = type; }
  public Class<T> getType() { return type; }
  // now what!?
  public Template() { this(Object.class); }
}
這個類的最後一個函數有問題,不能編譯經過。

若是一開始設計時就用工廠方法,就沒有這個問題了。咱們知道,最後一個函數想返回的是Template<Object>對象實例,以下: get

public final class Template<T> extends Object {
  private final Class<T> type;
  public Template(Class<T> type) { this.type = type; }
  public Class<T> getType() { return type; }
  @Deprecated
  @SuppressWarnings("unchecked")
  public Template() { this((Class<T>)Object.class); }
  public static Template<Object> create() {
    return new Template<Object>(Object.class);
  }
}
相關文章
相關標籤/搜索