1.单例模式介绍
单例模式是设计模式比较常用的之一,该设计模式目的是在整个应用程序中单例类的实例有且仅有一个。
2.应用场景
工具类,本身不存储数据,只用于一些通用功能实现。典型案例就是日志类,例如log4cplus
资源管理,例如打印机管理,同一时刻最好只有一个应用程序操作。
3.实现要点
构造函数私有,这样你就不能用new来实例化类了。
拷贝构造函数和=号操作符重载设置为私有,这样就无法进行类的复制。
类的初始化时间,有所谓的懒汉、饿汗策略。懒汉就是在使用时候进行类的实例化。饿汉就是事先申明好类的实例,调用时直接返回即可。对非实时系统而言都可以。
线程安全,主要是多线程同时获取实例时,有极小概率会生成两个实例,这个时候就要考虑进行加锁了。为了简化实现,可以使用函数内静态变量来实现。函数内静态变量,在函数第一次调用时才进行初始化,可以从编译角度来实现线程安全。看下汇编代码就会发现函数内静态变量初始化时,是加锁的。
4.代码
1 #ifndef CSINGLETON_H 2 #define CSINGLETON_H 3 4 5 class CSingleton 6 { 7 public: 8 static CSingleton* getInstance(); 9 10 private: 11 //构造函数、复制构造函数、=操作符设置为私有 12 CSingleton(); 13 CSingleton(const CSingleton& c); 14 CSingleton& operator=(const CSingleton& c); 15 }; 16 17 #endif // CSINGLETON_H
1 #include "csingleton.h" 2 3 4 CSingleton::CSingleton() 5 { 6 7 } 8 9 CSingleton::CSingleton(const CSingleton &c) 10 { 11 12 } 13 14 CSingleton *CSingleton::getInstance() 15 { 16 static CSingleton s_instance; 17 return &s_instance; 18 } 19 20 21 CSingleton &CSingleton::operator=(const CSingleton &c) 22 { 23 return *this; 24 }