【工作中学习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 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

linux系统编程之信号(二):一些信号发送函数和不同精度的睡眠

一、kill, raise, killpg 函数 int kill(pid_t pid, int sig); int raise(int sig); i...

1910
来自专栏牛客网

美团java后台实习三面

美团一面(50分钟) 1、spring的理解。 1、项目相关 2、Redis缓存的应用 3、http解析的全过程 4、Java中的锁 5、Hashmap和con...

3548
来自专栏天天P图攻城狮

iOS图像处理系列 - GPUImage源码解读(二)

导语 :billzbwang写的《iOS 图像处理系列 - GPUImage源码解读(一)》里详细地介绍了核心代码的具体实现,对GPUImage的使用者有很大的...

9118
来自专栏企鹅FM

深入浅出Kotlin协程

协程(Coroutines)在Kotlin1.x版本还处于实验阶段,android平台可以使用如下方式引入:

2873
来自专栏Java架构沉思录

Spring Boot是如何实现自动配置的

Spring Boot 是 Spring 旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为...

903
来自专栏大内老A

深入理解C# 3.x的新特性(2):Extension Method[下篇]

四、Extension Method的本质 通过上面一节的介绍,我们知道了在C#中如何去定义一个Extension Method:它是定义在一个Static c...

1829
来自专栏企鹅号快讯

Python之递归函数

Python之递归函数 好久没有更新内容了,也好久没有给大家打个招呼了,小白想死你们了。今天跟大家说说Python中的递归函数。 Python是支持递归函数的。...

1908
来自专栏高性能服务器开发

经典面试题(三)之网络通信题目集锦

1. TCP/IP协议栈层次结构 2. TCP三次握手需要知道的细节点 3. TCP四次挥手需要知道的细节点(CLOSE_WAIT、TIME_WAIT、MSL)...

3293
来自专栏小白的技术客栈

Python之递归函数

Python之递归函数 好久没有更新内容了,也好久没有给大家打个招呼了,小白想死你们了。今天跟大家说说Python中的递归函数。 Python是支持递归函数的...

3336
来自专栏技术博客

编写高质量代码改善C#程序的157个建议[4-9]

  本文首先亦同步到http://www.cnblogs.com/aehyok/p/3624579.html。本文主要来学习记录一下内容:

935

扫码关注云+社区