#include <iostream> using namespace std; /* 单例模式:懒汉式 一、保证该类只有一个实例。 二、考虑多线程安全 三、考虑资源释放 */ 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中返回,这样必须在外部初始化,不属于懒汉式;
二、若是将pInstance定义为getInstance函数中的局部静态变量,这样只要getInstance不被调用,pInstance就不会有值,但在多线程环境下局部静态变量(特别是对象)可以保证初始化一次仍然不肯定
*/
参考文献ios