Singleton:应如何使用
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日
回答:
使用Singleton模式当:
- 您需要在系统中拥有仅一个对象类型
如果以下情况,请勿使用Singleton模式:
- 您希望节省内存
- 您想尝试新功能
- 您想炫耀自己的技能
- 因为其他人都在使用(见维基百科上的貨物儀式程序員)
- 在用户界面组件中
- 它应该是缓存
- 在字符串中
- 在Session中
- 我可以一天不停止
如何创建最佳Singleton:
- 越小越好。我是极简主义者
- 确保它是线程安全的
- 确保它永远不会为空
- 确保它只创建一次
- 懒加载或系统初始化?根据您的需求
- 有时操作系统或Java虚拟机会为您创建单例(例如,在Java中,每个类定义都是单例)
- 提供析构函数或想出如何处理资源的方法
- 使用较少的内存