【工做中學習1】兩個設計模式:Singleton(單例)和 Adapter(適配器)

  很久沒有寫本身的學習小博客,罪過罪過。。最近本菜鳥在項目中接觸到常常用到的設計模式,首先是Singleton(單例),這個相信你們都會用到不少,因此本身用代碼實現一下,有助於本身學習理解,若有不對,請你們批評指正。windows

一. Singleton(單例)設計模式

  1. 文件:CSingleton.h多線程

 1 #include "stdafx.h"
 2 #include <windows.h>
 3 
 4 class CSingleton{
 5 public:
 6     static CSingleton* Instance()
 7     {
 8         if(m_instance == 0)
 9         {
10             //加鎖,防止多線程時屢次實例化,破壞單例
11             InitializeCriticalSection(&cs);
12             EnterCriticalSection(&cs);
13 
14             if(m_instance == 0)
15             {
16                 m_instance = new CSingleton();
17             }
18 
19             LeaveCriticalSection(&cs);
20             DeleteCriticalSection(&cs);
21         }
22 
23         return m_instance;
24     }
25     
26     static void CloseSingleton()
27     {
28         if(m_instance)
29         {
30             delete m_instance;
31             m_instance = 0;
32         }
33     }
34 
35     void SetNum(int num)
36     {
37         m_num = num;
38     }
39 
40     int GetNum()
41     {
42         return m_num;
43     }
44 
45 private:
46     CSingleton();
47 
48     ~CSingleton();
49 
50     static CSingleton* m_instance;
51 
52     static CRITICAL_SECTION cs;
53 
54     int m_num;
55 };

  2. 文件:CSingleton.cpp函數

 1 #include "stdafx.h"
 2 #include "CSingleton.h"
 3 
 4 using namespace std;
 5 
 6 CSingleton* CSingleton::m_instance = 0;
 7 CRITICAL_SECTION CSingleton::cs;
 8 
 9 CSingleton::CSingleton(): m_num(0)
10 {
11     cout << "CSingleton()" << endl;
12 }
13 
14 CSingleton::~CSingleton()
15 {
16     cout << "~CSingleton()" << endl;
17 }

  3. Main函數學習

 1 #include "stdafx.h"
 2 #include "CSingleton.h"
 3 
 4 using namespace std;
 5 
 6 int _tmain(int argc, _TCHAR* argv[])
 7 {
 8     CSingleton* A = CSingleton::Instance();
 9     
10     A->SetNum(5);
11 
12     CSingleton* B = CSingleton::Instance();    
13 
14     cout << "B->GetNum() = " << B->GetNum() << endl;
15 
16     system("Pause");
17     return 0;
18 }

  4. 程序運行結果:spa

    

    值爲5,說明指針A,B指向的是同一對象。線程

 

  5. 以上就是代碼的實現,我以爲本身學習過程當中要注意的幾點:設計

    A. 要加鎖,防止多線程時屢次調用構造函數,破壞單例指針

    B. 編譯時小的問題,不能引用winbase.h,而要用windows.h,不然會編譯報錯code

    C. 要有CloseSingleton()方法,來釋放單例的資源。構造函數和析構函數須要都是private。

 

二. Adapter(適配器)

  這是我在coding過程當中遇到的,其實我不能肯定是否就是Adapter的模式。主要是解決了一個小問題:

  三個類A,B,C,A是基類,B和C都是A的派生類,這時程序中利用多態特性,A的指針實際指向B或C的對象,來調用方法。

  

  這時,我須要向B中增長一個方法F,但不能改動C,若是直接在A中增長方法F,由於C也是A的派生類,間接的也改動了C,因此不合適。

  

  所以,這裏增長一個D類,D繼承於A,B改成繼承於D,由D增長F方法接口,B繼承實現此方法F。由此解決這一小問題。

  不肯定是不是Adapter的模式(百度百科:Adapter,將一個類的接口變換成客戶端所期待的一種接口,從而使本來因接口不匹配而沒法在一塊兒工做的兩個類可以在一塊兒工做)。

 

三. 近期小結:

  最近組裏任務不少,在coding過程當中學習到不少,做爲菜鳥,仍是要多多總結,哪怕是小問題,小的知識點:-)

 

 

Best Regards

Kevin Song

相關文章
相關標籤/搜索