第1条:考虑用静态工厂方法代替构造器

322 阅读1分钟

####优点

  • 静态工厂方法与构造器不同的第一大优势在于,它们有名称 根据名称,可以让人知道生成不同的对象
  • 静态工厂方法与构造器不同的第二大优势在于,不必每次调用它们的时候都创建一个新对象 单例时或者内部有缓存时,可以进行复用。
  • 静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象。
public interface Service{
}
public interface Provider{
  Service newService();
}
public class Services{
  private Service(){}
  private static final Map<String,Provider> providers = new ConcurrentHashMap<String,Provider>();
  public static final String DEFAUTL_PROVIDER_NAME = "<def>";
  public static void registerDefaultProvider(Provider p){
    registerProvider(DEFAULT_PROVIDER_NAME,p);
  }
  public static void registerProvider(String name,Provider p){
    providers.put(name,p);
  }
  public static Service newInstance({
    return newInstance(DEFAULT_PROVIDER_NAME);
  }
  public static Service newInstance(String name){
    Provider p = providers.get(name);
    if(p==null)
      throw new IllegalArgumentException();
    return p.newService();
  }
}

  • 静态工厂方法的第四大优势在于,在创建参数化类型实例的时候,它们会使代码变得更加简洁。
Map<String,List<String>> m = new HashMap<String,List<String>>();
//代替
public static <K,V> HashMap<K,V> newInstance(){
  return new HashMap<K,V>();
}
Map<String,List<String>> m = HashMap.newInstance();

####缺点

  • 类如果不含公有的或者受保护的构造器,就不能被子类化。 没法被继承
  • 它们与其他的静态方法实际上没有任何区别。 容易和其他静态方法搞混,最好通过命名将其区分开来,例如getInstance(),newInstance()