单例模式

  单例模式功能:

1. 确保一个类只有一个实例被建立 
2. 提供了一个对对象的全局访问指针 
3. 在不影响单例类的客户端的情况下允许将来有多个实例

一:懒汉式(特点:延迟加载,用的时候才创建对象)

class CSingleton  { 

public: 

static CSingleton* GetInstance()  {    

   if ( m_pInstance == NULL ) {        

      m_pInstance = new CSingleton();

}     

  return m_pInstance; 

                } 

}

private:    

  CSingleton(){};  

  static CSingleton * m_pInstance;

  };

  注:在懒汉式的单例类中,其实有两个状态,单例未初始化和单例已经初始化。假设单例还未初始化,有两个线程同时调用GetInstance方法,这时执行 m_pInstance == NULL 肯定为真,然后两个线程都初始化一个单例,最后得到的指针并不是指向同一个地方,不满足单例类的定义了,所以懒汉式的写法会出现线程安全的问题!在多线程环境下,要对其进行修改

  多线程情况下懒汉单例模式的代码:

  class Singleton  {

private:    

  static Singleton* m_instance;     

Singleton(){} 

public:     

static Singleton* getInstance();  }; 

   Singleton* Singleton::getInstance()  {     

if(NULL == m_instance)      {       

   Lock();//借用其它类来实现,如boost      

    if(NULL == m_instance)          {         

     m_instance = new Singleton;      

    }       

   UnLock();     

}     

return m_instance; 

}

      

二:饿汉式

class CSingleton    {   

private:        CSingleton() {  

            } 

   public:  

      static CSingleton * GetInstance() 

       {            

         return &instance;       

   }   

 private:

static CSingleton instance;  

};

总结:

懒汉和饿汉的区别:
  就是看定义的是静态成员对象变量还是静态成员对象指针变量;
因为如果定义了静态成员对象变量,程序在运行之初已经分配了空间,就要调用构造函数了,而你在调用getinstance的时候,不会再调用构造函数了,因为之前已经调用过了,你就是用的现成的,就是所谓的饿汉模式;
而定义了静态成员对象指针变量,程序运行之初也会分配空间,但是那个是指针的空间,而不是对象的空间,所以不会调用对象的构造函数,而只有调用getinstance进行new操作的时候,才会对其调用构造函数,所以叫懒汉模式。
原文地址:https://www.cnblogs.com/jobs1/p/10785486.html