Singleton anti-pattern
Possible Duplicate:
What is so bad about Singletons?
Singleton Design Pattern: Pitfalls
我听到很多这样的话,但丁没有找到确切的理由。
1
| Avoid the singleton anti-pattern and replace it with DI. |
但是,为什么呢?
- 感谢您的编辑和问题链接:)
- 这个链接可能会给你一些很好的提示。
有状态的单例更难进行单元测试。
我使用的是无状态的单例,我不认为这有什么问题。
因为单例可以实现接口,所以可以使用依赖注入来传递它们(并且在可能的情况下应该这样传递)
- 如果singleton是无状态的,那么为什么要有一个singleton而不是静态方法的集合呢?
- 没有"无状态单例"这样的东西。
- 无状态单例可以实现接口。假设您有一个Marshaller接口,它在功能上将一个对象转换为byte[]并再次返回。您希望能够通过DI传递不同的策略,这意味着您必须有一个实例才能通过。对于这一点有很多实现,每个实现都可能有自己的类,但是如果它们是无状态的,则只需要一个实例。
- 听起来像这样一种情况,让委托提供将对象转换为字节的函数会更好,这样它可以是实例的,也可以是静态的(假设您对使用和调用代码都有控制权)。
- 直接使用静态方法的问题是,当可能有几十种方法来处理数据时,只允许使用一种方法。DI应该允许您更改数据的编组方式,并允许其他人提供自己的方法。这需要一个实现公共接口的实例,但是如果该实例是无状态的,那么您只需要一个。
- 另一个例子是TimeService,它以微秒为单位给出时间。有一个简单的使用currentTimeMillis(),一个使用nanome(),第三个是可编程的(但不是无状态的)
- 如果对象不保持任何状态,那么是否有一个实例或多个实例为接口提供服务真的很重要?开销可以忽略不计,因为所有实例共享相同的类代码。
- @罗伯特哈维,这并不重要,除非它清楚地表明,不需要多个实例。有多个实例可能意味着这是有原因的。
- 彼得是对的,即使没有状态,如果不需要多个实例,为什么要创建这些多个实例?例如,string.empty是一个单例。创建足够多的空字符串,在某一点上会有明显的性能差异。