设计模式:单例模式
2016-01-25 13:21
253 查看
单例模式即保证类只能有一个实例,比如一个系统日志就需要使用单例模式;单例模式中将类的构造函数声明为private或protected,保证类外无法声明该类的对象,然后提供一个公有的静态方法获取私有的静态成员。虽然可以利用全局变量,程序中所有地方都能使用,但是全局变量不能确保只有一个实例。
这里可以使用程序退出时会自动调用全局变量的析构函数的特性:由于类的静态成员变量也是存储在全局区(静态区),程序退出时也会调用它们的析构函数。
我们可以在单例类中在声明一个回收类,并且声明一个回收类型静态成员。
如下:
前面的方法都是使用new来产生singleton,也可以使用返回静态局部变量的地址来实现:
#include<iostream> using namespace std; class Singleton{ public: static Singleton* getSingleton(){ if(singleton==NULL){ singleton=new Singleton(); return singleton; } } static void destorySingleton(){ if(singleton!=NULL){ delete singleton; singleton=NULL; } } private: Singleton(){}//构造函数设置为私有,防止类外被调用 static Singleton* singleton; }; Singleton* Singleton::singleton=NULL;//注意定义时不能有static int main(){ Singleton* tmp1=Singleton::getSingleton(); tmp1->destorySingleton(); }这种方法必须显式调用destorySingleton函数来析构new出来的singleton成员,很多人容易忘记调用它,所以想办法让我们不用去关心资源的释放。
这里可以使用程序退出时会自动调用全局变量的析构函数的特性:由于类的静态成员变量也是存储在全局区(静态区),程序退出时也会调用它们的析构函数。
我们可以在单例类中在声明一个回收类,并且声明一个回收类型静态成员。
如下:
#include<iostream> using namespace std; class Singleton{ public: static Singleton* getSingleton(){ if(singleton==NULL){ singleton=new Singleton(); return singleton; } } private: Singleton(){}//构造函数设置为私有,防止类外被调用 static Singleton* singleton; //设置一个回收类,它的析构函数帮忙析构单例类的singleton成员 class HelpDelete{ public: ~HelpDelete(){ if(Singleton::singleton!=NULL){ cout<<"I help to delete Singleton::singleton"<<endl; delete singleton; singleton=NULL; } } }; static HelpDelete aHelpDelete; }; Singleton* Singleton::singleton=NULL;//注意定义时不能有static Singleton::HelpDelete Singleton::aHelpDelete; int main(){ Singleton* tmp1=Singleton::getSingleton(); return 0; }回收类的析构函数中delete单例类的singleton成员。这样一来,我们就不用关心资源释放问题了。
前面的方法都是使用new来产生singleton,也可以使用返回静态局部变量的地址来实现:
#include<iostream> using namespace std; class Singleton{ public: static Singleton* getSingleton(){ static Singleton singleton; return &singleton; } private: Singleton(){ } }; int main(){ Singleton* tmp1=Singleton::getSingleton(); return 0; }
相关文章推荐
- docker 使用redis
- 51nod1109 01组成的倍数 数据结构
- config文件声明非系统节点的方法
- Python常用lib
- 面试题---***打印***
- 入职体检专家 公务员体检帮助
- Mapreduce中map方法自定义key类
- java正则表达式的匹配
- Spring中bean三种注解方式。
- Python获取目录、文件的注意事项
- Android 捕获HOME键
- RHCS
- Animation API
- 线程 detach作用
- 基本光线追踪软件的设计与实现
- iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
- 【学院官方整理】2016年备战上半年软考通关秘籍(内含经典押题资料)
- Spark本地开发环境搭建
- svn使用意见
- pycharm 安装venv的依赖包