懶漢式單例模式:不到萬不得已就不會去實例化類,也就是說在第一次用到類實例的時候纔會去實例化。
餓漢式單例模式:單例模式定義的時候就開始初始化。
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;
}