一、对类而言,获取自身一个实例的方法:
- 通过公有的构造器
- 通过类提供的公有的静态工厂方法
二、静态工厂方法对比构造器的优势:
- 它们有名称
- 不必在每次调用他们得时候都创建一个新对象
- 它们可以返回原返回类型的任何子类型的对象——例如:Java Collection Framework、java.util.EnumSet、JDBC API
- 服务提供者框架中三个重要的组件:服务接口、提供者注册API、服务访问API
- 在创建参数化类型实例的时候,它们使代码变得更加简洁——例如:
// 构造器创建实例
Map<String, List<String>> map = new HashMap<String, List<String>>();
// 静态工厂方法
public static <K, V> HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}
// 静态工厂方法创建实例
Map<String, List<String>> map = HashMap.newInstance();
三、静态工厂方法的缺点:
- 类如果不含公有的或者受保护的构造器,就不能被子类化
- 它们与其他的静态方法实际上没有任何区别
四、静态工厂方法的一些惯用名称:
- valueOf——不太严格地讲,该方法返回的实例与它的参数具有相同的值。这样的静态工厂方法实际上是类型转换方法。
- of——valueOf的一种更为简洁的替代,在EnumSet中使用并流行起来。
- getInstance——返回的实例是通过方法的参数来描述的,但是不能够说与参数具有同样的值。对于Singleton来说,该方法没有参数,并返回唯一的实例。
- newInstance——像getInstance一样,但newInstance能够确保返回的每个实例都与所有其他实例不同。
- getType——像getInstance一样,但是在工厂方法处于不同的类中的时候使用。Type表示工厂方法所返回的对象类型。
- newType——像newInstance一样,但是在工厂方法处于不同的类中的时候使用。Type表示工厂方法所返回的对象类型。
注:待完善.......