为什么使用单例而不是静态方法?

2022-08-31 10:05:15

对于这些关于帮助程序/实用程序类的简单问题,我从未找到过很好的答案:

  • 为什么我要创建单例(无状态)而不是使用静态方法?
  • 如果对象没有状态,为什么需要对象实例?

答案 1

通常,单例用于向应用程序引入某种全局状态。(说实话,这比真正必要的要多,但这是另一个时间的话题。

但是,在一些极端情况下,即使是无状态单例也可能有用:

  • 您希望在可预见的将来将其扩展到状态。
  • 出于某些特定的技术原因,您需要一个对象实例
    示例:C# 或 Java 语句的同步对象。locksynchronized
  • 您需要继承,即,您希望能够使用相同的接口但实现不同的实现轻松地将单例替换为另一个单例。
    示例:Java 中的方法将返回一个单例,其确切类型与系统相关。Toolkit.getDefaultToolkit()
  • 您希望哨兵值的参考相等性。
    示例:在 C# 中。DBNull.Value

答案 2

我可以看到使用无状态单例而不是静态方法类的情况,即用于依赖注入

如果你有一个直接使用的实用程序函数的帮助器类,它会创建一个隐藏的依赖关系;您无法控制谁可以使用它,或者在哪里使用它。通过无状态单例实例注入相同的帮助器类,您可以控制使用它的位置和方式,并在需要时替换/模拟它/等。

使其成为单例实例只是确保您分配的该类型的对象不会超出必要的范围(因为您只需要一个)。


推荐