首先看一下下面这个将boolean 转为Boolean对象的方法:
public static Boolean valueof(boolean b){
return b ? Boolean.TRUE : Boolean.FALSE;
}
利用静态工厂方法提供了客户端而不是构造器;
静态工厂方法与构造器不同的优势:
1、静态工厂方法有自定义的名称,产生的客户端代码更容易阅读。
public class Services { public static Services newInstance(){ return new Services(); } }
2、不需要再每次调用工厂方法都创建一个新的对象。
Boolean.valueof(boolean),就说明了这项技术,对实例对象进行重复利用,jdk源码显示:
public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE= new Boolean(false); public static Boolean valueof(boolean b){ return (b ? TRUE : FALSE); }
以上的TRUE和FALSE实例对象,构建好实例之后,就缓存起来,重复利用,避免了重复创建对象。
3、静态工厂方法可以返回原返回类型的任何子类型的对象
//Service interface
public interface Service {
}
//Service provider interface public interface Provider { Service newService(); } public class Services { private Services(){}; private static final Map<String,Provider> providers=new ConcurrentHashMap<>(); public static final String DEFAULT_PROVIDER_NAME="def";
//provider registeration 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=providers.get(name); if(p==null){ throw new IllegalArgumentException("No provider registered with name:"+name); } return p.newService(); } }
上述就是服务提供在框架,有三个重要的组件:服务接口、提供者注册API,服务访问API.
4、在创建参数化类型实例的时候,他们使代码变得更加简洁,最主要的是将多参数化的构造器简化成了很少或者没有参数的方法。更加简洁,通过对静态工厂方法命名,使得更加直观。例如:
Map<String,List<Map<String,List<String>>>> map = new HashMap<String,List<Map<String,List<String>>>>()
随着类型参数越来越长,越来越复杂,这一冗长的说明也很痛苦,但是有了静态工厂方法,编译器就可以替你找到类型参数.
public static <K,V> HaahMap<K,V> newInstance(){
retutn new HashMap<String,List<Map<String,List<String>>>>();
}
在简化成
Map<String,List<Map<String,List<String>>>> map = new HashMap<>();
之前,上述的静态工厂方法就是一种好的选择。
静态工厂方法的缺点:
1、类如果不包含公有的或者受保护的构造器,就不能被子类化
2、他们与其他的静态方法实际没有任何区别。
静态工厂方法的惯用名称:
valueof 、 of 、getInstance、 newInstance、 getType 、 newType
切记第一反应就提供公有构造器,而不先考虑静态工厂。