第一条 考虑使用静态工厂方法代替构造器
类可以通过静态工厂方法来提供它的客户端,而不是通过构造器。提供静态工厂方法而不是公有的构造器。这样做有几大优势:
1.静态工厂方法与构造器不同的第一大优势在于,它们有名称。
一个类只能有一个带有指定签名的构造器。编程人员通常知道如何避开这一限制:通过提供两个构造器,他们的参数列表只在参数类型的顺序上有所不同。用户可能会常常调错构造器。
由于静态工厂方法有名称,所以不会有所限制。当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器。慎重选择名称!
2.不必在每次调用时都产生一个新的对象。
类似于flyweight模式
3.它们可以返回原返回类型的任何子类型的对象。
这项技术适用于基于接口的框架.
静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不必存在。这种灵活的静态工厂方法构成了服务提供者框架,例如JDBC API。
4.在创建参数化类型实例的时候,它们使代码变得更加简洁。
例如HashMap
Map<String,Long> m=new HashMap<String,Long>();
//随着类型参数变得越来越长,这一冗长的说明也越来越痛苦
//但是有了静态工厂方法,编译期就可以替你找到类型参数。这被称作类型推导。
//假设HashMap提供了静态方法
public static <K,V> HashMap<K,V> newInstance(){
return new HashMap<K,v>();
}
//然后就可以用以下代码来实现
Map<String,Long> m=HashMap.newInstance();
静态工厂方法的缺点:
1.类如果不含公有的或者受保护的构造器,就不能被子类化。
2.他们与其他的静态方法实际上没有任何区别。