c++单例模式

来源:互联网 发布:软件行业的职位 编辑:程序博客网 时间:2024/06/16 12:03

如何实现单例模式:

#include <iostream>   using namespace std;   //单例类的C++实现   class Singleton   {   private:    Singleton();//注意:构造方法私有    virtual ~Singleton();    static Singleton* instance;//惟一实例    int var;//成员变量(用于测试)   public:    static Singleton* GetInstance();//工厂方法(用来获得实例)    int getVar();//获得var的值    void setVar(int);//设置var的值   };   //构造方法实现   Singleton::Singleton()   {    this->var = 20;    cout<<"Singleton Constructor"<<endl;   } /*Singleton::~Singleton()   {       delete instance;   }  */Singleton::~Singleton(){ if(instance != NULL) {  delete instance; }}//初始化静态成员   //Singleton* Singleton::instance=new Singleton();  Singleton* Singleton::instance=NULL;Singleton* Singleton::GetInstance()   {    if(instance == NULL) {  instance = new Singleton(); } return instance;   }   //seter && getter含数   int Singleton::getVar()   {    return this->var;   }   void Singleton::setVar(int var)   {    this->var = var;   }   //main   int main(int argc, char* argv[])   {    Singleton *ton1 = Singleton::GetInstance();    Singleton *ton2 = Singleton::GetInstance();    cout<<"ton1 var = "<<ton1->getVar()<<endl;    ton1->setVar(150);   cout<<"ton2 var = "<<ton2->getVar()<<endl;    return 0;   }  以上的代码,是实现单例模式的一个代码,我实在搞不懂,里面到底哪里体现出单例模式来了?
=====为什么叫单例模式======
1、构造方法私有 那么,就意味着,只能在Singleton的成员函数中,才能调用Singleton的构造函数来创建实例。在Singleton之外,不能创建Singleton对象的实例。2、代码中,定义了GetInstance方法,只能通过GetInstance方法来获取Singleton对象的实例,单例就是在GetInstance方法中控制的。首先,Singleton有一个static Singleton* instance;//惟一实例  Singleton* Singleton::instance=NULL;在这里初始化为NULL。Singleton* Singleton::GetInstance()   {    if(instance == NULL) {  instance = new Singleton(); } return instance;   }   上面的函数,就是通过instance来实现单例的。当第一次调用GetInstance时,instance 为NULL,所以会执行instance = new Singleton();把这个新建的实例保存到静态成员instance,并返回这个指针。第二次到第N次调用GetInstance时,由于instance不为空,所以会直接返回instance 。也就是第一次调用GetInstance创建的那个实例。所以这样就实现了,单实例。
思就是说,Singleton对象的实例,只会被创建一次,就是说内存中,只存在一个Singleton的实例,就是所谓,单实例。
==========销毁=========
C++中的单例模式 单例模式很有用,使用单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。但是在程序的开发过程中我们总是遇到一些问题,而这些问题主要集中在单例类的消毁过程中,普通使用的单例模式的类如下:class Singleton:{    // 其它成员public:    static Singleton * GetInstance()    {        if (m_pInstance == NULL)            m_pInstance = new Singleton();        return m_pInstance;    } private:    Singleton(){};    static Singleton * m_pInstance;}可是这个类在什么时候调用它的析构函数呢,我们怎么消毁它。提供一个公用的destroy函数来进行它的消毁吗,这很不美观。最后我就在网上找到了如果下的代码处理了这个问题:class Singleton:{    // 其它成员public:    static Singleton * GetInstance(){...}private:    Singleton(){};    static Singleton * m_pInstance;     class CGarbo // 它的唯一工作就是在析构函数中删除Singleton的实例    {    public:        ~CGarbo(){            if (Singleton::m_pInstance)                delete Singleton::m_pInstance;        }    };     static CGarbo Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数}这是非常好的方法,静态成员对象 Garbo 在析构时会自动的消毁单例,我们不用再担心这个问题了。但是添加一个类的静态对象,总是让人不太满意,所以有人用如下方法来重现实现单例和解决它相应的问题,代码如下:class Singleton:{    // 其它成员public:    static Singleton &GetInstance(){        static Singleton instance;        return instance;    } private:    Singleton(){};}使用局部静态变量,非常强大的方法,完全实现了单例的特性,而且代码量更少,也不用担心单例消毁的问题。在后期的项目中我全使用了这种方法,可是在项目的开发过程中还是出现了问题,当如下方法使用单例时问题来了,Singleton singletion = Singleto::GetInstance();这么做就产生了一个类拷贝的问题,这就为背了单例的特性。产生这个问题的原因在于,编译器会为类生成一个默认的构造函数,来支持类的拷贝。最后没有办法,我们要禁止类拷贝和类赋值,禁止程序员用这种方式来使用单例,当时领导的意思是GetInstance()函数返回一个指针而不是返回一个引用,函数代码改为如下:    static Singleton *GetInstance(){        static Singleton instance;        return &instance;    }可我总是感觉不好,为什么不让编译器不这么干呢。这时我才想起可以显式的声明类拷贝的构造函数,和重载=操作符,新的单例类如下:class Singleton:{    // 其它成员public:    static Singleton &GetInstance(){        static Singleton instance;        return instance;    } private:    Singleton(){};    Singleton(const Singleton&);    Singleton & operate = (const Singleton&);}关于Singleton(const Singleton&);和Singleton & operate = (const Singleton&);函数,我们要声明成私用的,并且只声明不实现。这样子后如果用上面的方式来使用单例时,不管是在友元类中还是其它的,编译器都是报错。不知道这样的单例类是否还会有问题,但在程序中这样子使用已经基本没有问题了。

原创粉丝点击