C++設計模式-Singleton


Singleton單例模式

Singleton 是對全局變量的取代策略
作用:保證一個類只能有一個實例,並提供一個全局唯一的訪問點。

僅有一個實例:通過類的靜態成員變量來體現。
提供訪問它的全局訪問點:訪問靜態成員變量的靜態成員函數來體現。

《設計模式》一書中給出了一種很不錯的實現,定義一個單例類,使用類的私有靜態指針變量指向類的唯一實例,並用一個公有的靜態方法獲取該實例。

單例模式通過類本身來管理其唯一實例,這種特性提供了解決問題的方法。唯一的實例是類的一個普通對象,但設計這個類時,讓它只能創建一個實例並提供對此實例的全局訪問。唯一實例類Singleton在靜態成員函數中隱藏創建實例的操作。習慣上把這個成員函數叫做Instance(),它的返回值是唯一實例的指針。

單例類Singleton有以下特征:

它有一個指向唯一實例的靜態指針,並且是私有的;

它有一個公有的函數,可以獲取這個唯一的實例,並且在需要的時候創建該實例;

它的構造函數是私有的,這樣就不能從別處創建該類的實例。

 

UML圖:

在Singleton模式的結構圖中可以看到,我們通過維護一個static的成員變量_instance來記錄這個唯一的對象實例。通過提供一個staitc的接口Instance來獲得這個唯一的實例。

代碼如下:

Singleton.h

 1 #ifndef _SINGLETON_H_
 2 #define _SINGLETON_H_
 3 
 4 class Singleton
 5 {
 6 private:
 7     static Singleton* pInstance;//靜態成員,保存對象的唯一實例
 8     Singleton();//私有化構造函數,使其無法在類外實例化
 9 public:
10     static Singleton* Instance();
11     //void Destroy();
12     static void Destroy();
13 };
14 
15 #endif

 

Singleton.cpp

 1 #include "Singleton.h"
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 Singleton* Singleton::pInstance = NULL;
 7 
 8 Singleton::Singleton()
 9 {
10     cout<< "Singleton..." << endl;
11 }
12 
13 Singleton* Singleton::Instance()
14 {
15     if(NULL == pInstance)
16     {
17         pInstance = new Singleton();
18     }
19     return pInstance;
20 }
21 
22 void Singleton::Destroy()
23 {
24     delete pInstance;
25     pInstance = NULL;
26     cout<< "Destroy..." << endl;
27 }

main.cpp

 1 #include "Singleton.h"
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     Singleton* ps = Singleton::Instance();//通過全局訪問點獲取實例
 9     Singleton::Destroy();
10     return 0;
11 }

 

Singleton不可以被實例化,因此我們將其構造函數聲明為protected或者直接聲明為private。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM