Singleton(單例)
阿新 • • 發佈:2020-11-03
5. Singleton(單例)
5.1 定義
確保一個類只有一個例項,而且自行例項化並向整個系統提供這個例項
5.2 應用
單例模式的主要作用是確保一個類只有一個例項存在。單例模式可以用在建立目錄、資料庫連線等需要單執行緒操作的場合,用於實現對系統資源的控制。
5.3 懶漢單例模式
5.3.1 定義
第一次引用類時,才進行物件例項化。
5.3.2 c++原始碼例程
非執行緒安全的懶漢單例模式
1 class Singleton 2 { 3 public: 4 static Singleton* getInstance(); 5 ~Singleton(){}6 7 private: 8 Singleton(){} //建構函式私有,防止通過拷貝構造,賦值運算例項化物件 9 Singleton(const Singleton& obj) = delete; //明確拒絕 10 Singleton& operator=(const Singleton& obj) = delete; //明確拒絕 11 12 static Singleton* m_pSingleton; 13 }; 14 15Singleton* Singleton::m_pSingleton = NULL; 16 17 Singleton* Singleton::getInstance() 18 { 19 if(m_pSingleton == NULL) 20 { 21 m_pSingleton = new Singleton; 22 } 23 return m_pSingleton; 24 }
執行緒安全的懶漢單例模式
1 std::mutex mt; 2 3 class Singleton 4 { 5 public: 6 staticSingleton* getInstance(); 7 private: 8 Singleton(){} //建構函式私有 9 Singleton(const Singleton&) = delete; //明確拒絕 10 Singleton& operator=(const Singleton&) = delete; //明確拒絕 11 12 static Singleton* m_pSingleton; 13 14 }; 15 Singleton* Singleton::m_pSingleton = NULL; 16 17 Singleton* Singleton::getInstance() 18 { 19 if(m_pSingleton == NULL) 20 { 21 mt.lock(); 22 if(m_pSingleton == NULL) 23 { 24 m_pSingleton = new Singleton(); 25 } 26 mt.unlock(); 27 } 28 return m_pSingleton; 29 }
5.4 餓漢單例模式
5.4.1 定義
類載入時,就進行物件例項化
1 //餓漢式:執行緒安全,注意一定要在合適的地方去delete它 2 class Singleton 3 { 4 public: 5 static Singleton* getInstance(); 6 private: 7 Singleton(){} //建構函式私有 8 Singleton(const Singleton&) = delete; //明確拒絕 9 Singleton& operator=(const Singleton&) = delete; //明確拒絕 10 11 static Singleton* m_pSingleton; 12 }; 13 14 Singleton* Singleton::m_pSingleton = new Singleton(); 15 16 Singleton* Singleton::getInstance() 17 { 18 return m_pSingleton; 19 }