c++ - 单例:应该如何使用

标签 c++ design-patterns singleton

编辑: 从另一个问题中,我提供了一个答案,其中包含许多关于单例的问题/答案的链接:More info about singletons here:

所以我已经阅读了帖子 Singletons: good design or a crutch?
争论仍在继续。

我将单例视为一种设计模式(好的和坏的)。

Singleton 的问题不在于模式,而在于用户(对不起大家)。每个人和他们的父亲都认为他们可以正确地实现一项(根据我所做的许多采访,大多数人都不能)。同样因为每个人都认为他们可以实现正确的单例,所以他们滥用模式并在不合适的情况下使用它(用单例替换全局变量!)。

所以需要回答的主要问题是:

  • 什么时候应该使用单例
  • 如何正确实现单例

我对这篇文章的希望是,我们可以在一个地方(而不是必须用谷歌搜索多个站点)收集有关何时(以及如何)正确使用 Singleton 的权威来源。同样合适的是反使用和常见不良实现的列表,解释它们为什么无法工作以及好的实现它们的弱点。


所以开始吧:
我会举手说这是我用的,但可能有问题。
我喜欢“Scott Myers”在他的书“Effective C++”中对主题的处理

Good Situations to use Singletons (not many):

  • Logging frameworks
  • Thread recycling pools
/*
 * C++ Singleton
 * Limitation: Single Threaded Design
 * See: http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
 *      For problems associated with locking in multi threaded applications
 *
 * Limitation:
 * If you use this Singleton (A) within a destructor of another Singleton (B)
 * This Singleton (A) must be fully constructed before the constructor of (B)
 * is called.
 */
class MySingleton
{
    private:
        // Private Constructor
        MySingleton();
        // Stop the compiler generating methods of copy the object
        MySingleton(MySingleton const& copy);            // Not Implemented
        MySingleton& operator=(MySingleton const& copy); // Not Implemented

    public:
        static MySingleton& getInstance()
        {
            // The only instance
            // Guaranteed to be lazy initialized
            // Guaranteed that it will be destroyed correctly
            static MySingleton instance;
            return instance;
        }
};

好的。让我们一起来批评一下和其他实现。
:-)

最佳答案

答案:

在以下情况下使用单例:

  • 您需要在系统中拥有一个且只有一个类型的对象

在以下情况下不要使用单例:

  • 你想节省内存
  • 您想尝试新事物
  • 你想炫耀你知道多少
  • 因为其他人都在这样做(参见维基百科中的 cargo cult programmer)
  • 在用户界面小部件中
  • 应该是缓存
  • 在字符串中
  • 在 session 中
  • 我可以整天去

如何创建最好的单例:

  • 越小越好。我是极简主义者
  • 确保它是线程安全的
  • 确保它永远不会为空
  • 确保只创建一次
  • 懒惰或系统初始化?满足您的要求
  • 有时操作系统或 JVM 会为您创建单例(例如,在 Java 中,每个类定义都是一个单例)
  • 提供一个析构函数或以某种方式弄清楚如何处置资源
  • 使用少量内存

关于c++ - 单例:应该如何使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/86582/

相关文章:

c++ - std::thread 和 std::cin.get

c++ - 在构造函数中,没有匹配的函数调用

design-patterns - 在装饰器模式中将实例变量移动到抽象类中的原因是什么?

php - Codeigniter:构造部分 View 的最佳方式

c# - 枚举组合的设计模式(方法参数)

singleton - Kotlin 单例(使用对象修饰符声明)何时实例化?

c++ - 如何使用 boost::flyweight 作为 GOF 模式?

c++ - 在 NTFS 上打开许多小文件太慢了

c# - 为什么对单例使用 Lazy<T> 而不是静态工厂类?

c++ - 将指向单例的指针分配给对象字段