【Practical API Design学习笔记】工厂方法由于构造函数

原因:

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<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>对象实例,如下:

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);
  }
}





你可能感兴趣的:(api)