什么是静态工厂方法?
通过
1.className.getInstance();
2.className.newInstance();
3.className.valueOf();
等静态方法获得对象实例。
而一般我们会直接采用
new className(param1,param2)即构造器的方法来得到实例
静态工厂方法相比于构造器的优势
1.静态方法有名称
构造器并没有确切描述返回的对象,而适当名称的静态工厂方法可以有更佳的可读性。
2.静态工厂方法可以采用单例模式等限制对象数量
静态方法返回的对象可以是 new className(),也可以是已经有的对象。
3.静态工厂方法可以返回类型的任何子类型
样例代码
public interface Service{
\\some function
}
public interface Provider{
Service newService();
}
public class Services{
private Services(){};
private static final Map<String,Provider> providers = new ConcurrentHashMap<String,Provider>();
//provider register API
public static void registerDefaultProvider(Provider p){
registerProvider(DEFAULT_PROVIDER_NAME,p);
}
public static void registerProvider(String name,Provider p){
providers.put(name,p);
}
//Service access API
public static Service newInstance(){
return newInstance(DEFAULT_PROVIDER_NAME);
}
public static Service newInstance(String name){
Provider p = provider.get(name);
if(p==null){
throw new IllegalArgumentException(
"No Provider registered with name:"+name);
return p.newService();
}
}
4.在创建参数化实例的时候,代码更简洁
代码:
Map<String,Integer> map = new HashMap<String,Integer>();
//对比
public static <K,V> HashMap<K,V> newInstance(){
return new HashMap<K,V>();
}