Singleton:应如何使用

28 浏览
0 Comments

Singleton:应如何使用

编辑:

从另一个问题得到了一个答案,其中包含很多关于单例模式的问题和解答的链接:单例模式更多信息在这里:

因此,我阅读了这个主题 单例模式:良好的设计还是辅助手段?

争论仍在继续。

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

单例模式的问题不在于模式本身,而在于用户(对不起,大家)。每个人和他们的父亲都认为自己可以正确实现(而我所做过的许多面试中,大多数人都做不到)。此外,由于每个人都认为自己可以正确实现单例模式,他们滥用这种模式并在不适当的情况下使用它(用单例替换全局变量!)。

因此,需要回答的主要问题是:

  • 何时应该使用单例模式
  • 如何正确实现单例模式

我对这篇文章的希望是,我们可以在一个单一的地方(而不是必须在Google和多个网站上搜索)收集关于何时(以及如何)正确使用单例模式的权威来源。还适当的是一个反用途列表和常见的错误实现,解释它们为什么会失败,以及对于好的实现,它们的弱点。


所以开始吧:

我会举起手来说这就是我所使用的东西,但可能存在问题。

我喜欢“Scott Myers”在他的书“Effective C++”中对这个主题的处理。

使用单例模式的好处(不是很多):

  • 日志框架
  • 线程回收池

/*
 * 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;
        }
};

好的,让我们一起来批评和探讨其他实现方法。

🙂

admin 更改状态以发布 2023年5月24日
0
0 Comments

回答:

使用Singleton模式当:

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

如果以下情况,请勿使用Singleton模式:

  • 您希望节省内存
  • 您想尝试新功能
  • 您想炫耀自己的技能
  • 因为其他人都在使用(见维基百科上的貨物儀式程序員)
  • 在用户界面组件中
  • 它应该是缓存
  • 在字符串中
  • 在Session中
  • 我可以一天不停止

如何创建最佳Singleton:

  • 越小越好。我是极简主义者
  • 确保它是线程安全的
  • 确保它永远不会为空
  • 确保它只创建一次
  • 懒加载或系统初始化?根据您的需求
  • 有时操作系统或Java虚拟机会为您创建单例(例如,在Java中,每个类定义都是单例)
  • 提供析构函数或想出如何处理资源的方法
  • 使用较少的内存
0