原因:
1、工厂方法返回的实例不一定是该类的实例,可以是它的子类的实例。但是构造函数只能new出该类的实例;
2、工厂方法创建的对象可以缓存,以便下次使用,构造函数不可以;
3、对于同步的控制,工厂方法可以将创建对象前后的代码进行统一处理,构造函数就无能为力了;
4、工厂方法支持参数化返回类型,构造函数不支持。
例如:
在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这个类的最后一个函数有问题,不能编译通过。extends Object { private final Class type; public Template(Class type) { this.type = type; } public Class getType() { return type; } // now what!? public Template() { this(Object.class); }}
如果一开始设计时就用工厂方法,就没有这个问题了。我们知道,最后一个函数想返回的是Template<Object>对象实例,如下:
public final class Templateextends Object { private final Class type; public Template(Class type) { this.type = type; } public Class getType() { return type; } @Deprecated @SuppressWarnings("unchecked") public Template() { this((Class )Object.class); } public static Template