个人理解1、不具备线程安全的懒汉单例模式2、线程安全的懒汉单例模式3、返回一个reference指向local static对象4、饿汉单例模式
个人理解单例模式顾名思义,保证一个类仅可以有一个实例化对象,并且提供一个可以访问它的全局接口。1、不具备线程安全的懒汉单例模式
#include2、线程安全的懒汉单例模式using namespace std; class Singleton { private: Singleton(){} Singleton(const Singleton& obj) = delete; Singleton& operator = (const Singleton& obj) = delete; static Singleton* m_instance; public: static Singleton* GetInstance(); }; Singleton* Singleton::m_instance = NULL; Singleton* Singleton::GetInstance() { if (m_instance == NULL) m_instance = new Singleton(); return m_instance; } int main() { Singleton* s = Singleton::GetInstance(); return 0; }
在单例模式构造时加锁防止构造失败
#include3、返回一个reference指向local static对象#include using namespace std; std::mutex mt; class Singleton { private: Singleton(){} Singleton(const Singleton& obj) = delete; Singleton& operator = (const Singleton& obj) = delete; static Singleton* m_instance; public: static Singleton* GetInstance(); }; Singleton* Singleton::m_instance = NULL; Singleton* Singleton::GetInstance() { mt.lock(); if (m_instance == NULL) m_instance = new Singleton(); mt.unlock(); return m_instance; } int main() { Singleton* s = Singleton::GetInstance(); return 0; }
这种实现方式的好处是不用删除它
#include4、饿汉单例模式using namespace std; class Singleton { private: Singleton(){} Singleton(const Singleton& obj) = delete; Singleton& operator = (const Singleton& obj) = delete; public: static Singleton& GetInstance(); }; Singleton& Singleton::GetInstance() { static Singleton singleton; return singleton; } int main() { return 0; }
在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。
#includeusing namespace std; class Singleton { private: Singleton(){} Singleton(const Singleton& obj) = delete; Singleton& operator = (const Singleton& obj) = delete; public: static Singleton* m_instance; static Singleton* GetInstance(); }; Singleton* Singleton::m_instance = new Singleton(); Singleton* Singleton::GetInstance() { return m_instance; } int main() { Singleton::GetInstance(); return 0; }



