####优点
- 静态工厂方法与构造器不同的第一大优势在于,它们有名称 根据名称,可以让人知道生成不同的对象
- 静态工厂方法与构造器不同的第二大优势在于,不必每次调用它们的时候都创建一个新对象 单例时或者内部有缓存时,可以进行复用。
- 静态工厂方法与构造器不同的第三大优势在于,它们可以返回原返回类型的任何子类型的对象。
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()