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

相关文章

来自专栏杨龙飞前端

scrollto 到指定位置

2984
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2787
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

4239
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3025
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

3000
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

7306
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3685
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

3017
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5248
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8848

扫码关注云+社区