一個類不管創建多少次對象,永遠只能得到該類型一個對象的實力
常用到的,比如日志模塊,數據庫模塊
餓漢式單例模式:還沒有獲取實例對象,實例對象就已經產生了
懶漢式單例模式:唯一的實例對象,直到第一次獲取它的時候,才產生
餓漢式單例模式? 餓漢式單例模式一定是線程安全的
#include <iostream>
using namespace std;
class Singleton
{
public:static Singleton* getInstance() //3.獲取類的唯一實例對象的接口方法{return &instance;}
private:static Singleton instance;//2.定義一個唯一的類的實例對象Singleton() //1.構造函數私有化{}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};
Singleton Singleton::instance;
int main()
{Singleton* p1 = Singleton::getInstance();Singleton* p2 = Singleton::getInstance();Singleton* p3 = Singleton::getInstance();cout << p1 << " " << p2 << " " << p3 << " " << endl;return 0;
}
懶漢式單例模式 線程安全的懶漢式單例模式案例
#include <iostream>
#include <mutex>
using namespace std;
std::mutex mtx;
class Singleton
{
public://是不是可重入函數呢? 鎖+雙重判斷static Singleton* getInstance() //3.獲取類的唯一實例對象的接口方法{//lock_guard<std::mutex> lck(mtx);//鎖的力度太大了if (instance == nullptr){lock_guard<std::mutex> lck(mtx);if (instance == nullptr){//開辟內存,構造對象,給instance賦值instance = new Singleton();}}return instance;}
private:static Singleton *volatile instance;//2.定義一個唯一的類的實例對象Singleton() //1.構造函數私有化{}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};
Singleton* volatile Singleton::instance = nullptr;
int main()
{Singleton* p1 = Singleton::getInstance();Singleton* p2 = Singleton::getInstance();Singleton* p3 = Singleton::getInstance();cout << p1 << " " << p2 << " " << p3 << " " << endl;return 0;
}
更加簡便的懶漢式單例模式
#include <iostream>
#include <mutex>
using namespace std;
std::mutex mtx;
class Singleton
{
public://是不是可重入函數呢? 鎖+雙重判斷static Singleton* getInstance() //3.獲取類的唯一實例對象的接口方法{static Singleton instance;//2.定義一個唯一的類的實例對象return &instance;}
private:Singleton() //1.構造函數私有化{}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};
int main()
{Singleton* p1 = Singleton::getInstance();Singleton* p2 = Singleton::getInstance();Singleton* p3 = Singleton::getInstance();cout << p1 << " " << p2 << " " << p3 << " " << endl;return 0;
}