【问题标题】:What's wrong with singleton? [closed]单例有什么问题? [关闭]
【发布时间】:2008-09-17 19:25:28
【问题描述】:

不要在这个问题上浪费时间。跟进:What is so bad about singletons?


请随意在Singleton上发牢骚。

Singleton 的不当使用可能会导致大量油漆。你在使用单例时遇到过什么样的问题?这种模式的常见误用是什么?


在深入研究 Corey 的回答后,我发现了一些关于这个主题的精彩文章。

【问题讨论】:

  • 如何回答您自己的问题,并发布一些您不喜欢的内容?这在 SO 中是可以接受的,并且可能会引发富有成效的讨论。

标签: language-agnostic design-patterns oop singleton


【解决方案1】:

单例模式本质上并没有错。它是一种工具,有时应该使用它。

【讨论】:

  • 单例模式是邪恶的,必须销毁。从来没有任何充分的理由使用它。这么说来,Singleton 模式基本上只是一种修饰全局变量的奇特方式。全局变量是好是坏?
  • 取决于用途,让服务跟踪所有线程和其他对象实例中的对象实例......好吧,全局变量非常方便。如果不是,我们永远不会得到这些伟大的静态对象。
【解决方案2】:

有时它可以使您的代码更紧密地与从代码库的不同部分直接按名称引用的单例类耦合。因此,例如,当您需要测试代码的某些部分并且它从代码的不同部分引用单例时,您不能轻易地用模拟对象伪造该依赖项。

【讨论】:

    【解决方案3】:

    我认为一个更合适的问题可能是:在什么情况下使用单例模式不合适?或者你见过什么不应该使用单例的。

    【讨论】:

      【解决方案4】:

      单例本身并没有什么问题,作为一种模式,它在认识到某些对象只需要创建一次方面发挥着至关重要的作用。

      它经常被用来委婉地表达全局变量,试图绕过全局变量的污名,而这种用法本质上是错误的。如果全局变量恰好是正确的解决方案,则使用单例不会改善它。如果使用全局变量(通常情况下)是不正确的,那么将其包装在单例中不会使其更正确。

      【讨论】:

        【解决方案5】:

        我没有像其他一些海报那样接触过 Singleton,但我见过的几乎所有实现(在 C# 中)都可以通过静态类/方法实现。我想您可能会争辩说静态类是单例模式的实现,但这不是我所看到的。当人们真正需要的是使用 static 关键字时,我一直看到人们构建和管理这些 Singleton 类/对象。

        所以,我不会说单例模式不好。我会说这有点像枪。我不认为枪支不好,但它们肯定会被不当使用。

        【讨论】:

          【解决方案6】:

          基本上,单例是一种拥有静态数据并假装它不是真正静态的方法。

          我当然会使用它,但尽量不要滥用它。

          【讨论】:

            【解决方案7】:

            原始 GoF 设计的一个基本问题是析构函数没有受到保护。任何引用了单例实例的人都可以随意销毁单例。

            请参阅 John Vlissides 在他的书“模式孵化”(Amazon link) 中更新“杀死一个单身人士”。

            干杯,

            罗伯

            【讨论】:

              【解决方案8】:

              我看到的大多数单例模式都不是以线程安全的方式编写的。如果写得正确,它们会很有用。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-04-07
                • 1970-01-01
                • 1970-01-01
                • 2021-04-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多