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