【工作中学习1】两个设计模式:Singleton(单例)和 Adapter(适配器)

  好久没有写自己的学习小文章,罪过罪过。。最近本菜鸟在项目中接触到经常用到的设计模式,首先是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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏柠檬先生

jquery鼠标事件

click()   为点击事件绑定一个事件处理函数,或者触发元素点击事件。   .click( handler(eventObject) ) ...

20770
来自专栏liulun

自己动手写UI库——引入ExtJs(布局)

第一:来看一下最终的效果 ? 第二:来看一下使用方法: ? 第三: Component类代码如下所示: public class Compo...

21750
来自专栏我和未来有约会

(收藏)JS验证

1 /* 2 函数名:检验表单的函数 3 作者:xuwen 日期:2007-2-10 4 参数 _obj:验证的对象 ...

280100
来自专栏vue学习

vue实例-vue官网学习笔记

1、构造器 ①每个vue.js应用都是通过构造函数Vue创建一个Vue的根实例启动的:

13910
来自专栏魂祭心

原 js页面传值参数打包类

35450
来自专栏web前端教室

web前端零基础课-1012上周总结

类组件中的方法内部不绑定this,在方法内部使用this,需要用bind(this)传入

10820
来自专栏别先生

Javascript函数的简单学习

第九课 函数的定义与调用 1:函数的定义     语法格式     function 函数名(数据类型 参数1){//function是定义函数的关键字    ...

19680
来自专栏从零开始学 Web 前端

从零开始学 Web 之 jQuery(八)each,多库共存,包装集,插件

each 方法用来遍历 jQuery 对象的,它的参数是一个事件处理函数,这个事件处理函数有两个参数,第一个参数是索引,第二个参数时索引对应的 DOM 对象,使...

12940
来自专栏nice_每一天

如何编写高效的jQuery代码(转载)

1. jQuery速度再快,也无法与原生的javascript方法相比,而且建立的jQuery对象包含的信息量很庞大。所以有原生方法可以使用的场合,尽量避免使...

8120
来自专栏卡少编程之旅

四个Vue的写法优化技巧

37360

扫码关注云+社区

领取腾讯云代金券