Singleton和静态工厂方法之间有什么区别

时间:2017-10-22 16:53:43

标签: java design-patterns singleton effective-java static-factory

我想知道单例和静态工厂方法是否只创建一个实例,那么为什么有两个概念用于相同目的?

注意:这里的术语"静态工厂方法"取自Joshua bloch撰写的有效Java书籍:

"静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时创建新对象。这允许不可变类(第15项)使用预构建的实例,或者在构造它们时缓存实例,并重复分配它们以避免创建不必要的重复对象。 Boolean.valueOf(boolean)方法说明了这种技术:它永远不会创建一个对象。这种技术类似于Flyweight模式[Gamma95,p。 195]。如果经常请求等效对象,它可以极大地提高性能,特别是如果它们创建起来很昂贵。 静态工厂方法从重复调用返回同一对象的能力允许类在任何时候保持对存在的实例的严格控制。执行此操作的类称为实例控制。编写实例控制类有几个原因。 实例控件允许类保证它是单例(第3项)或不可实例化(第4项) "

2 个答案:

答案 0 :(得分:1)

静态工厂方法是一种构造方法,它可以返回新实例,替换类型的子类,包装关键日志记录或注册表,将多个项组成一个对象,或者(可能)返回一个静态实例

通过任何方式获得的单身人士总是会回到同一个实例。这意味着没有可变性。

答案 1 :(得分:0)

”每次调用时都不需要创建新对象“是这样的(与new不同,总是< / em>创建一个新对象)可以以更聪明的方式实现工厂方法,以重用现有对象。

查看Guava of()中的ImmutableList工厂方法。此方法返回“空”不可变列表 -  每次调用of()时都没有必要构造一个新对象,而是始终返回相同的对象。这是安全的,因为任何空的ImmutableList实例在功能上都与任何其他空实例无法区分。