好久没有写自己的学习小文章,罪过罪过。。最近本菜鸟在项目中接触到经常用到的设计模式,首先是Singleton(单例),这个相信大家都会用到很多,所以自己用代码实现一下,有助于自己学习理解,如有不对,请大家批评指正。
一. 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. 程序运行结果:
值为5,说明指针A,B指向的是同一对象。
5. 以上就是代码的实现,我觉得自己学习过程中要注意的几点:
A. 要加锁,防止多线程时多次调用构造函数,破坏单例
B. 编译时小的问题,不能引用winbase.h,而要用windows.h,否则会编译报错
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