我想知道单例和静态工厂方法是否都只创建一个实例,那么为什么有两个概念用于同一目的?
注意:这里的术语“静态工厂方法”取自 Joshua bloch 的 Effective java book,他在其中写道:
执行此操作的类被称为实例控制的。编写实例控制类有几个原因。实例控制允许一个类保证它是单例(第 3 项)或不可实例化(第 4 项) ”
我想知道单例和静态工厂方法是否都只创建一个实例,那么为什么有两个概念用于同一目的?
注意:这里的术语“静态工厂方法”取自 Joshua bloch 的 Effective java book,他在其中写道:
执行此操作的类被称为实例控制的。编写实例控制类有几个原因。实例控制允许一个类保证它是单例(第 3 项)或不可实例化(第 4 项) ”
“它们不需要在每次调用时都创建一个新对象”这一行所表达的观点是(与new
总是创建一个新对象不同)工厂方法可以以某种更聪明的方式实现,即重用现有对象。
看一下of()
Guava 中的工厂方法ImmutableList
。这个方法返回“那个”空的不可变列表——每次of()
调用都没有必要构造一个新对象,而是总是返回同一个对象。这是安全的,因为任何空ImmutableList
实例在功能上都无法与任何其他空实例区分开来。
静态工厂方法是一种构造方法,它可以返回新实例、替代类型的子类、包装关键日志记录或注册表、将多个项目组合到一个对象中,或者(可能)返回单个静态实例。
通过任何方式获得的单例总是解析回同一个实例。这意味着没有可变性。