4.2 静态工厂方法
工厂模式非常实用,但是为每一个类创建一个工厂方法方法类会引起工厂类的泛滥,此时,我们可以使用静态工厂方法来避免——在每个类里实现一个静态的工厂方法,就不需要额外的工厂类了。静态工厂方法在“Effective Java”[1]一书中有详细的介绍,我们也经常使用它们。例如,在Java 5版本里,为创建基本类型Integer、Long、Boolean对象都提供了静态工厂方法,以Integer类为例,它的静态工厂方法如下所示。
代码注解
java. lang.Integer.IntegerCache.high 默认值是127,可以通过设置VM的启动参数值来设定(大于127才有意义)。如果在[-128,IntegerCache.high]之间,则返回IntegerCache类缓存的Integer对象,否则创建一个新的Integer对象。
这里需要注意的是,由于Integer是不可变(immutable)对象,所以这些缓存对象不会引起计算上的错误。
静态工厂方法的优缺点
优点
可以为静态工厂选择合适的命名,提高程序的可读性。一段优秀的代码具有可读性,并不一定需要冗长的注释,有时候根据类名、方法名、变量名的良好命名更容易使读者读懂程序。
静态工厂和工厂模式一样,可以封装复杂的初始化过程,实现实例的缓存。
还可以根据不同的输入返回不同实现类/具体类对象。
缺点
一般为了强迫使用工厂方法,不直接使用构造方法来构造实例,我们会强迫类只含有私有构造方法,这样,会导致此类不能被子类化。
如果添加了一个新的该类的子类(该类有非私有的构造方法),此静态工厂方法可能需要重写,以加入该子类的实例化过程,导致扩展性不强。
静态方法没有面向对象的特征,比如继承、动态多态等,不可被覆写(Overwritten)。
[1] 参见该书的Item 1:Consider providing static factory methods instead of constructors。