【问题标题】:When should I use a singleton class in C++?什么时候应该在 C++ 中使用单例类?
【发布时间】:2011-07-10 02:35:15
【问题描述】:

从 C++ 初学者的角度来看,我认为单例类有用的唯一原因与我想使用静态变量时类似。你们知道什么时候最适合使用单例类吗?

【问题讨论】:

    标签: c++ singleton


    【解决方案1】:

    您应该使用单例的唯一情况是在极少数情况下,只有这些对象中的一个是至关重要的。这根本不像您想象的那样经常出现。

    通常只创建一个相关类的实例就足够了,但没有放入强制对象唯一性所需的所有机制。

    每次我使用单例(或在我使用的代码库中找到一个)时,我最终都会删除它,因为我需要更改行为,而单例机制妨碍了我。我还没有在我们的代码(支付处理)中看到一个单例实际上有意义的案例。我有很多案例,我只有一个特定类的一个实例,但没有一个通过单例模式强制执行是必要的或有帮助的。

    【讨论】:

      【解决方案2】:

      当你真正需要它时,你会知道的。

      这可能永远不会发生。

      当你认为你想要它时,你可能错了。

      【讨论】:

        【解决方案3】:

        我想不出任何适合使用单例类的实例。

        在 Java 中,它们主要用于组织。但是,在 C++ 中,您应该使用命名空间。

        【讨论】:

        • @Mark 你在说什么?
        • 让几件事做同一件事的目的是什么?
        • @Mark 单例模式不是 C++ 的一个特性。这是一种可以在 C++ 中实现的设计模式。
        • 你觉得静态变量是什么特性?
        • @Mark 命名空间和具有静态成员的类不一样。
        【解决方案4】:

        我曾经使用 global 静态访问器创建单例:UserRegistry::getInstance()。现在,在Dependency Injection 时代,我只使用registry。也有助于进行单元测试。

        【讨论】:

          【解决方案5】:

          单例类是美化的全局变量。仅在绝对必要时使用,即当一个对象在整个实现范围内只有一个实例时。

          【讨论】:

          • 为什么不总是使用静态变量?我什么时候不需要使用单例类?
          • @Mark:静态变量也是美化的全局变量。
          • 甚至可能改进全局变量,因为它们至少被限制在类上下文中。
          【解决方案6】:

          昨天在 Hacker News 上有一个帖子讨论何时使用单例不是一个好主意。关于何时使用单例(全局配置数据,网络服务器应用程序中的会话管理)是一个好主意,那里有几个想法,但是对于单例的每一个理由,也有很好的论据来说明为什么这不是一个好主意。 http://news.ycombinator.com/item?id=2743894

          【讨论】:

            【解决方案7】:

            在游戏开发领域,我认为绝对需要将类实现为单例的几个原因:

            物理引擎、Sprite 处理程序、重力处理程序(如果与物理引擎分开)、输入解析器等。

            【讨论】:

            • 这些都绝对需要作为单例实现。
            【解决方案8】:

            没有单例一切都可以解决。但我发现自己使用它来更好地控制图形上下文等对象的初始化和破坏。或者在使用状态机更好地控制状态转换时。此外,在(极少数)系统资源限制为 1 个单元(例如控制台)的情况下,以及在多线程处理以防止条件竞争时。 (https://refactoring.guru/design-patterns/singleton/cpp/example)

            【讨论】:

              猜你喜欢
              • 2011-06-16
              • 2012-06-10
              • 2010-12-30
              • 2010-10-18
              • 2013-02-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多