单身人士有哪些特定的合法用途?

Emi*_*ier 10 singleton design-patterns anti-patterns

可能重复:
在设计模式上:何时使用Singleton?

这个问题不是关于单身人士是否"被视为有害".我只是想知道,从你的经验,都有些什么具体情况,其中单身似乎运作良好.

编辑: 请,如果你想讨论单身的恰当性和/或邪恶一般,有已位于exising问题:137975,11831

哎呀!我刚刚发现我的问题已在这里被问到:关于设计模式:何时使用Singleton?

Joe*_*Joe 7

我们基本上将它们用于两件事:日志记录和配置.两者都假设应用程序具有中央配置和中央日志文件,并不总是有效,但在我们的大部分代码中都是如此.我们还偶尔会对某些工厂类或缓存类使用它们,以确保我们不会复制关键元数据.


jus*_*ody 5

扩大我的评论...

这个问题措辞不佳,单身人士似乎在许多情况下都能很好地工作。应该是“在哪些特定情况下单身人士不会暴露其负面属性?” 简而言之,“什么时候全局变量好”?

  1. 全局变量是一个全局变量。

    只要你使用

    void f() { X* x = X::getInstance(); ... }

    而不是void f(X*),您的意大利面订单已被接受。

  2. 单身人士激增,喜欢相互依赖。 SessionManager使用EventManager哪个使用LogManager. 有人希望日志文件提及当前用户的姓名。该LogManager维护者增加了SessionManager::getInstance()->getUser()->getName();,一切的玫瑰花,直到LoginManager,它也使用LogManager,希望登录登录失败。

  3. 单例会抑制可测试性。

    单实例属性仅在生产代码中是半有用的。您可能void f()根本无法测试该功能,并且可能仅针对快乐路径进行(很少)测试。

你可以猜到,我对全局变量什么时候好用的回答是“从不”。什么是你的

  • *“...什么时候全局变量好?”* 你问我?到目前为止,当依赖注入将是一个总 PITA(比全局变量给你的单元测试问题更大的 PITA)时,我会使用单例(如果你愿意,可以称它们为全局变量)。例如,我无法想象将日志对象传递给我的每个类。 (2认同)