【C++】單例模式:餓漢模式和懶漢模式
阿新 • • 發佈:2018-12-02
餓漢模式:提前建立一個靜態的類物件,把所有能夠建立物件的模組全部私有化,從外部需要建立類物件時只能返回事先建立好的唯一物件。就像一個特別飢餓的人,提前準備好食物,只要餓了,就可以立刻食用。
/*惡漢模式--單例模式*/ #include<iostream> using namespace std; class Singleton { public: static Singleton& GetInstance() { return _ps; } private: Singleton(){}; Singleton(const Singleton& s) = delete; Singleton& operator=(Singleton const&); static Singleton _ps ; }; Singleton Singleton::_ps; int main() { cout << &Singleton::GetInstance() << endl; cout << &Singleton::GetInstance() << endl; return 0; }
2.懶漢模式:也是把所有建立物件的模組私有化,當外部需要建立物件的時候,通過呼叫方法在類內部用new建立一個物件,如果物件已經存在則直接返回物件。不過需要考慮多執行緒情況,做加鎖解鎖處理。這種方法就像一個非常懶惰的人,只有在吃飯的時候才會洗碗。
* *單例模式---單例模式---懶漢模式式 */ #include<mutex> #include<thread> #include <iostream> using namespace std; class Singleton { public: static Singleton* GetInstance() { if(nullptr == _ps){ _mutex.lock(); if(nullptr == _ps){ _ps = new Singleton(); cout << "test" << endl; } _mutex.unlock(); } return _ps; } public: class GC { public: ~GC(){ if(nullptr != _ps){ delete _ps; _ps = nullptr; } } }; private: Singleton(){}; Singleton(const Singleton&); static Singleton* volatile _ps; static mutex _mutex; static GC _gc; }; Singleton* volatile Singleton::_ps = nullptr; mutex Singleton::_mutex; Singleton::GC _gc; void Func() { Singleton::GetInstance(); } int main() { thread t1(Func,10); thread t2(Func,10); t1.join(); t2.join(); return 0; }