为啥单例比全局对象更好[重复]

Posted

技术标签:

【中文标题】为啥单例比全局对象更好[重复]【英文标题】:Why is Singleton a better choice than Global Objects [duplicate]为什么单例比全局对象更好[重复] 【发布时间】:2013-02-18 01:22:14 【问题描述】:

你好堆栈溢出。

我正在准备明天的 CS 考试,我正在查看我们的教授为我们提供的复习表。其中一点说要知道为什么 Singleton 是比 Global 更好的选择。

我不太确定其中的原因,但我确实记得他说过 Singleton 使用较少的“命名空间污染”。我在 Google 上进行了几次比较 Singleton 和 Global 的搜索,但几乎所有结果都表明两者都是糟糕的选择,哈哈。所以这让我不再困惑了。

如果有人能帮我解决这个问题,将不胜感激。谢谢!

【问题讨论】:

单例 全局对象。这就像问为什么方法比成员函数更好。 嗯,static order initialization fiasco 令人沮丧,但两者都不是很好。 啊,found it。 我不同意“使用较少的命名空间污染”。当然,对于全局类或单例类,仍然有一个名称。名称可能不同,但仍然是某种可能与另一个名称发生冲突的名称。但如果这是你的导师要求的答案,那就记住它。 @ModdedLife 您创建了一个包含一堆值和函数的命名全局对象,而不是一堆函数和值,每个函数和值都有自己的全局可用名称。 【参考方案1】:

它们是懒惰的构造:

LargeObject   global;                    // Large object is always constructed.

class LargeObject_Singelton

    public: static LargeObject& getInstance()
    
        static LargeObject  instance;     // This object is not created until the first
        return instance;                  // time getInstance() is called.
                                         // If you never use it this can be important.
;

【讨论】:

嗯。请您再深入一点解释一下吗? 可以懒惰构造。如果可能有多个线程访问它们,那么惰性构造实际上是一个问题(因为您需要另一个全局对象来锁定对实例的第一次调用)。 @ModdedLife:不知道还有什么要说的。全局总是被创建的。 singelton 仅在您需要时创建。如果创建对象的成本很大,您可能不想创建对象,除非您需要它。 我认为如果有一个并不总是需要的大对象,您可能希望能够在某个时候将其删除。 @john.pavan:Singelton 在程序结束时被正确销毁。以及为什么要破坏创建成本高昂的东西。这意味着您必须再次支付费用。懒惰评估的全部意义在于投入成本(如果你不需要,就不要付钱)。

以上是关于为啥单例比全局对象更好[重复]的主要内容,如果未能解决你的问题,请参考以下文章

同步方法或同步块:在java中编写单例类时哪一个更好? [重复]

枚举单例比DCL和静态单例要好?还真就是这样~

单例设计模式

实现接口的单例类[重复]

DateTime.hasvalue vs datetime == null,哪个更好以及为啥[重复]

单例对象和基类对象之间的区别是啥[重复]