#include <iostream> using namespace std; /* 单例模式:懒汉式 1、保证该类只有一个实例。 2、考虑多线程安全 3、考虑资源释放 */ class Lock{ public: Lock(){ //加锁代码 } ~Lock(){ //开锁代码 } }; class Singleton{ class Garbo{ //辅助类,垃圾回收器 public: ~Garbo(){ if(Singleton::pInstance != NULL){ delete Singleton::pInstance; Singleton::pInstance = NULL; } } }; private: static Singleton * pInstance; static Garbo garbo; //当程序结束时自动delete pInstance; Singleton(){}; //禁止自定义对象 Singleton(const Singleton & rhs); //禁止拷贝构造对象 const Singleton & operator=(const Singleton & rhs); ~Singleton(){ cout << "I'm deleted!"<<endl; //防止外部析构 } public: static Singleton * getInstance(); void display(){ cout << "other opeartions"<<endl; } }; //静态成员初始化 Singleton* Singleton::pInstance = 0; Singleton::Garbo Singleton::garbo; Singleton * Singleton::getInstance(){ if(pInstance == NULL){ //懒汉式 Lock lock; //资源管理对象:利用局部对象的构造和析构来进行加锁和开锁; if(pInstance == NULL){ //这句并非多余s pInstance = new Singleton(); } } return pInstance; } int main() { Singleton *ps =Singleton::getInstance(); ps->display(); }
/*注:关于为何不适用静态成员来实习初始化一次,原因如下:
1.如果将pInstance定义为静态类成员,即static Singleton Instance,然后在getInstance中返回,这样必须在外部初始化,不属于懒汉式;
2、如果将pInstance定义为getInstance函数中的局部静态变量,这样只要getInstance不被调用,pInstance就不会有值,但在多线程环境下局部静态变量(特别是对象)能够保证初始化一次仍然不确定
*/
参考文献