博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【工作中学习1】两个设计模式:Singleton(单例)和 Adapter(适配器)
阅读量:6282 次
发布时间:2019-06-22

本文共 2569 字,大约阅读时间需要 8 分钟。

  好久没有写自己的学习小博客,罪过罪过。。最近本菜鸟在项目中接触到经常用到的设计模式,首先是Singleton(单例),这个相信大家都会用到很多,所以自己用代码实现一下,有助于自己学习理解,如有不对,请大家批评指正。

一. Singleton(单例)

  1. 文件:CSingleton.h

1 #include "stdafx.h" 2 #include 
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

   

转载于:https://www.cnblogs.com/KevinSong/p/3672766.html

你可能感兴趣的文章
基于RBAC权限管理
查看>>
基于Internet的软件工程策略
查看>>
数学公式的英语读法
查看>>
留德十年
查看>>
迷人的卡耐基说话术
查看>>
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>
数据库
查看>>
Vue------第二天(计算属性、侦听器、绑定Class、绑定Style)
查看>>
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>
PHP 7.1是否支持操作符重载?
查看>>
Vue.js 中v-for和v-if一起使用,来判断select中的option为选中项
查看>>
Java中AES加密解密以及签名校验
查看>>
定义内部类 继承 AsyncTask 来实现异步网络请求
查看>>
VC中怎么读取.txt文件
查看>>