c++單例模式

1.功能:ios

  只能有一個實例的類,用於相似計數、內存池的狀況。安全

2.實現方法:多線程

  [1]構造函數設置爲private,所以不能在外部建立實例。函數

  [2]提供一個public方法訪問實例。spa

  [3]析構函數,析構函數是爲了銷燬這個類的成員變量,private和public均可以,可是析構函數裏面不能delete這個類的實例(析構函數裏面delete實例自己就是有問題的,由於delete會調用析構函數,析構裏面又delete,會形成遞歸)。線程

  [4]實例銷燬方法:一種是定義一個垃圾回收類,自動銷燬這個實例;一種是在外面手動delete這個實例;還一種是定義爲訪問函數裏面的靜態成員,當程序退出的時候自動釋放這個實例。code

3.代碼實現:對象

  [1]函數內部靜態成員變量方式,第一次訪問的時候建立實例,而且線程安全:blog

 1 #include <iostream>  
 2 #include <stdio.h>  
 3 using namespace std;  
 4   
 5 class singleton  
 6 {  
 7 public:  
 8     static singleton *get_instance(){  
 9         static singleton single;
10         return &single;
11     }  
12 private:  
13     singleton(){
14         printf("singleton() called.\n");
15     }
16 
17     ~singleton(){
18         printf("~singleton() called.\n");
19     }  
20 };  
21   
22 
23 int main(int argc, char *argv[])  
24 {  
25     singleton *s = singleton::get_instance();  
26     return 0;  
27 }  

 輸出:遞歸

 

   [2]使用靜態的成員變量方式,第一次訪問的時候建立實例,而且添加了垃圾回收類:

 1 #include <iostream>  
 2 #include <stdio.h>  
 3 using namespace std;  
 4   
 5 class singleton  
 6 {  
 7 public:  
 8     static singleton *get_instance(){  
 9         if(m_instance == NULL){  
10             m_instance = new singleton();  
11             printf("get_instance() called.\n");
12         }  
13         
14         return m_instance;  
15     }  
16     
17     ~singleton(){
18         printf("~singleton() called.\n");
19     }  
20   
21 private:  
22     singleton(){
23         printf("singleton() called.\n");
24     }  
25     
26     class gc
27     {  
28     public:  
29         gc(){  
30             printf("gc() called.\n");
31         }
32         
33         ~gc(){  
34             printf("~gc() called.\n");
35             if(m_instance != NULL){  
36                 delete m_instance;  
37                 m_instance = NULL;  
38             }  
39         }
40     };  
41     
42     static gc m_gc;
43     static singleton *m_instance;  
44 };  
45   
46 singleton *singleton::m_instance = NULL;  
47 singleton::gc singleton::m_gc;
48 
49 int main(int argc, char *argv[])  
50 {  
51     singleton *s = singleton::get_instance();  
52     return 0;  
53 }  

輸出:

4.說明:

  [1]上面的兩種方式沒有好壞之分,只是不一樣的實現方式,其餘還有各類方式實現單實例,可是都沒什麼區別。

  [2]關於析構函數,由於private類型的析構函數沒法在外部使用delete對象,因此準備在外面手動釋放這個類的實例和其餘內部成員時,應該把析構函數設置爲public,若是想讓這個類的全部成員必須在類內部釋放(類裏面的垃圾回收類中釋放),則應該把析構函數設置爲private。

  [3]多線程使用,就是加上鎖處理m_instance實例,和常規的多線程沒什麼區別。 

相關文章
相關標籤/搜索