單例模式(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; }