深入理解单例模式
来源:互联网 发布:招行一金通软件下载 编辑:程序博客网 时间:2024/06/06 02:13
1、介绍:是软件开发过程中面临的一般问题的解决方案,也就是一套被反复使用,经过分类,代码设计总结出来的经验.2、特点:(1)保证全局只有一个唯一的实例对象(2)单例类提供获取这个唯一获取实例的接口3、分类:分为饿汉模式和懒汉模式4、代码实现:class Singleton //懒汉模式{public: static Singleton *GetInstance() { if (m_Instance == NULL ) { Lock(); // C++没有直接的Lock操作,请使用其它库的Lock,比如Boost,此处仅为了说明 if (m_Instance == NULL ) { m_Instance = new Singleton (); } UnLock(); // C++没有直接的Lock操作,请使用其它库的Lock,比如Boost,此处仅为了说明 } return m_Instance; }/*次处进行了两次m_Instance == NULL的判断,是借鉴了Java的单例模式实现时,使用的所谓的“双检锁”机制。因为进行一次加锁和解锁是需要付出对应的代价的,而进行两次判断,就可以避免多次加锁与解锁操作,同时也保证了线程安全。但是,这种实现方法在平时的项目开发中用的很好,也没有什么问题?但是,如果进行大数据的操作,加锁操作将成为一个性能的瓶颈;为此,一种新的单例模式的实现也就出现了。*/ static void DestoryInstance()// way 1 { if (m_Instance != NULL ) { delete m_Instance; m_Instance = NULL ; } } //在类外手动调用DestoryInstance()函数释放资源,容易忘记,所以就有了以下的释放方法class Destroy //way 2 { public: ~Destroy() { if (instance) { delete instance; instance = NULL; } } };Private: Singleton(){} Singleton(constSingleton&) {} Singleton operator=(const Singleton&){} private: static Singleton *m_Instance;};Singleton *Singleton ::m_Instance = NULL;// way 2释放时 /*在程序运行结束时,系统会调用Singleton的静态成员Destroy的析构函数, 该析构函数会进行资源的释放,而这种资源的释放方式是在程序员“不知道” 的情况下进行的,而程序员不用特别的去关心,使用单例模式的代码时,不必关心资源的释放。 那么这种实现方式的原理是什么呢?由于程序在结束的时候,系统会自动析构所有的全局变量, 实际上,系统也会析构所有类的静态成员变量,就像这些静态变量是全局变量一样。我们知道, 静态变量和全局变量在内存中,都是存储在静态存储区的,所以在析构时,是同等对待的。 那我先从实际的项目中说起吧,在实际项目中,特别是客户端开发,其实是不在乎这个实例的销毁的。 因为,全局就这么一个变量,全局都要用,它的生命周期伴随着软件的生命周期,软件结束了, 它也就自然而然的结束了,因为一个程序关闭之后,它会释放它占用的内存资源的,所以, 也就没有所谓的内存泄漏了。但是,有以下情况,是必须需要进行实例销毁的:在类中,有一些文件锁了, 文件句柄,数据库连接等等,这些随着程序的关闭而不会立即关闭的资源,必须要在程序关闭前,进行手动释放;*/class Singleton //饿汉模式 {public:static Singleton* Getinstance(){ static Singleton instance; return &instance; //注意返回值是引用}private: Singleton(){} Singleton(constSingleton&) {} Singleton operator=(const Singleton&){} private: static Singleton *instance;};Singleton Singleton::instance=NULL;//释放资源和上面的懒汉模式方法一样,这里就不在赘述了。
阅读全文
1 0
- 单例模式深入理解
- 深入理解单例模式
- 深入理解单例模式
- 深入理解单例模式
- 深入理解单例模式
- 深入理解Java单例模式
- 单例模式的深入理解
- 【Java】设计模式:深入理解单例模式
- 深入理解Java4:Singleton单例模式七种方式
- 单例模式-析构函数的深入理解
- 深入单例模式
- 深入单例模式
- 单例模式理解
- 理解单例模式
- 单例模式深入研究
- 单例模式深入剖析
- 单例模式深入分析
- 深入Java单例模式
- (八)Redux:提取Component
- H5 学习笔记1
- 51nod 1092 回文字符串 LCS 或 区间dp
- (十)Redux:官方react-redux的初步使用(Provider组件、connect函数)
- 杭电acm1197
- 深入理解单例模式
- (十一)Redux:进阶(初始state)
- HihoCoder1036[Trie图 ] AC自动机
- Jetty
- 关于React native 的总结和笔记
- Linux kernel内存映射实例分析
- Ubuntu下如何安装mysql的源码包
- FPGA利用FIFO做数据缓冲
- SASS的简单用法