1. 程式人生 > 實用技巧 >Singleton(單例)

Singleton(單例)

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 15
Singleton* 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     static
Singleton* 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 }