設計模式之單例模式(懶漢、餓漢)

懶漢式單例模式:不到萬不得已就不會去實例化類,也就是說在第一次用到類實例的時候纔會去實例化。

餓漢式單例模式:單例模式定義的時候就開始初始化。

 

1.加鎖的懶漢式(線程安全)

#include<mutex>

class Singleton{
private:
    //構造函數私有
    Singleton(){
       
    }
    ~Singleton(){}
    //阻止拷貝
    Singleton(const Singleton& rhs);
    Singleton& operator=(const Singleton&rhs);
    //指向實例的指針
       static Singleton *pInstance;
    //用於線程安全的鎖
      static std::mutex Mutex;
public:
   //產生實例
    static Singleton* getInstance();
};
std::mutex Singleton::Mutex;
Singleton* Singleton::pInstance=nullptr;//初始化時,置爲空

Singleton* Singleton::getInstance(){
    if(pInstance==nullptr){//注意,出錯兩次檢查指針是否爲空
          //加鎖
          Mutex.lock();
          if(pInstance==nullptr)
              pInstance=new Singleton();
         //解鎖
          Mutex.unlock();
    }
     
    return pInstance;
}

 

2.餓漢式

注意:單例的餓漢實現是線程安全的,因爲對象在使用前就已經創建出來了。

class Singleton{
private:
    //構造函數私有
    Singleton(){
       
    }
    ~Singleton(){}
    //阻止拷貝
    Singleton(const Singleton& rhs);
    Singleton& operator=(const Singleton&rhs);
    //指向實例的指針
       static Singleton *pInstance;

public:
   //產生實例
    static Singleton* getInstance();
};

Singleton* Singleton::pInstance=new Singleton();//注意,在一開始時,就初始化指向示例的指針

Singleton* Singleton::getInstance(){
       //直接返回指向實例的指針
      return pInstance;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章