单例模式(Singleton),是设计模式里面最多见、最经常使用的设计模式,也是最简单、最容易实现的设计模式。 单例模式的目的很简单,建立一个全局惟一的对象(类or变量)。ios
//Simple_Singleton.h class Singleton { public: static Singleton* GetInstance() { if (!m_pSingleton) { m_pSingleton = new Singleton(); } return m_pSingleton; } static void DesInstance() { if (m_pSingleton) { delete m_pSingleton; m_pSingleton = nullptr; } } private: Singleton(); static Singleton* m_pSingleton; }; Singleton* Singleton::m_pSingleton = nullptr;
//Magic_Singleton.h /************************************************************************/ /* 名称:万能单例类 */ /* 说明:可把任何类包装成线程安全的全局单例类,出口默认智能指针 */ /* 做者:Song */ /* Email:songshuda@vip.qq.com */ /************************************************************************/ #ifndef MAGIC_SINGLETON_H #define MAGIC_SINGLETON_H #include <mutex> #include <memory> template<typename T> class Magic_Singleton { public: //获取全局单例对象 template<typename ...Args> static std::shared_ptr<T> GetInstance(Args&&... args) { if (!m_pSington) { std::lock_guard<std::mutex> gLock(m_Mutex); if (nullptr == m_pSington) { m_pSington = std::make_shared<T>(std::forward<Args>(args)...); } } return m_pSington; } //主动析构单例对象(通常不须要主动析构,除非特殊需求) static void DesInstance() { if (m_pSington) { m_pSington.reset(); m_pSington = nullptr; } } private: explicit Magic_Singleton(); Magic_Singleton(const Magic_Singleton&) = delete; Magic_Singleton& operator=(const Magic_Singleton&) = delete; ~Magic_Singleton(); private: static std::shared_ptr<T> m_pSington; static std::mutex m_Mutex; }; template<typename T> std::shared_ptr<T> Magic_Singleton<T>::m_pSington = nullptr; template<typename T> std::mutex Magic_Singleton<T>::m_Mutex; #endif
利用了C++11的智能指针和自解锁等,巧妙避免了全部问题,并实现自动GC。设计模式
//test.cpp #include <iostream> #include "Magic_Singleton.h" using namespace std; class MyClass { public: MyClass(const string& strData) : m_strData(strData) { cout << m_strData.data() << endl; }; ~MyClass() { cout << "destory" << endl; }; private: string m_strData; }; auto main()->int { //等同于入口函数int main() auto pClass = Magic_Singleton<MyClass>::GetInstance("create"); Magic_Singleton<MyClass>::DesInstance(); return 1; }