【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);
  }
}
相关文章
相关标签/搜索