緣由: 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); } }