单例模式的C++实现

#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就不会有值,但在多线程环境下局部静态变量(特别是对象)能够保证初始化一次仍然不确定
*/

参考文献

posted on 2015-08-20 14:41  gaoyanqing  阅读(183)  评论(0编辑  收藏  举报

导航