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

一. Singleton(单例)

  1. 文件:CSingleton.h

 #include "stdafx.h"
#include <windows.h> class CSingleton{
public:
static CSingleton* Instance()
{
if(m_instance == )
{
//加锁,防止多线程时多次实例化,破坏单例
InitializeCriticalSection(&cs);
EnterCriticalSection(&cs); if(m_instance == )
{
m_instance = new CSingleton();
} LeaveCriticalSection(&cs);
DeleteCriticalSection(&cs);
} return m_instance;
} static void CloseSingleton()
{
if(m_instance)
{
delete m_instance;
m_instance = ;
}
} void SetNum(int num)
{
m_num = num;
} int GetNum()
{
return m_num;
} private:
CSingleton(); ~CSingleton(); static CSingleton* m_instance; static CRITICAL_SECTION cs; int m_num;
};

  2. 文件:CSingleton.cpp

 #include "stdafx.h"
#include "CSingleton.h" using namespace std; CSingleton* CSingleton::m_instance = ;
CRITICAL_SECTION CSingleton::cs; CSingleton::CSingleton(): m_num()
{
cout << "CSingleton()" << endl;
} CSingleton::~CSingleton()
{
cout << "~CSingleton()" << endl;
}

  3. Main函数

 #include "stdafx.h"
#include "CSingleton.h" using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
CSingleton* A = CSingleton::Instance(); A->SetNum(); CSingleton* B = CSingleton::Instance(); cout << "B->GetNum() = " << B->GetNum() << endl; system("Pause");
return ;
}

  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

  

【工作中学习1】两个设计模式:Singleton(单例)和 Adapter(适配器)的更多相关文章

  1. 两种设计模式(2)==>>"单例"

    所谓“单例”: 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资 ...

  2. 设计模式 Singleton 单例 懒汉,线程安全

    首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...

  3. 算法、数据结构、与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design)

    算法.数据结构.与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design) 作者: Compasslg 李涵威 1. 什么是单例设计(Singleton Design) 在学 ...

  4. java singleton(单例设计模式)

    单例设计模式的主要作用是: 1.控制资源的使用,我们对资源使用线程同步来实现并发访问. 2.节约资源,我们对一个类只进行一个实例化进行全局的资源访问,节约了内存. 3.作为通信媒介,也是数据共享,可以 ...

  5. Java设计模式:Singleton(单例)模式

    概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...

  6. Java基础 static限定符的使用 以及【 static实现的 singleton(单例)设计模式】

    static实现的 singleton(单例)设计模式 /** static实现的 singleton设计模式 , 使得一个类只能够创建一个static对象 */ 模板设计结构: package Co ...

  7. 设计模式——懒汉式单例类PK饿汉式单例类

    前言 我们都知道生活中好多小软件,有的支持多IP在线,有的仅仅局限于单个IP在线.为什么这样设计,在软件开发阶段就是,有需求就是发展.这就是软件开发的一个设计模式--懒汉式单例类和饿汉式单例类. 内容 ...

  8. Java设计模式之单例

    一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ...

  9. Java设计模式之单例设计模式总结

    package singleton; /**单例设计模式 饿汉式 * * @author gx *这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化, ...

  10. 游戏设计模式——C++单例类

    前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...

随机推荐

  1. java反射之一

    public static void main(String[] args) { try { Class cla = Class.forName("com.money.test.Employ ...

  2. day20 模块 collections time sys os

    1.模块 1. 模块的定义:我们把装有特定功能的代码进行归类的结果.我们目前写的所有py文件都是模块 2. 引入模块的方式: 1.import 模块名 2.from xxx import 模块名 2. ...

  3. Jenkins自动化CI CD流水线之6--构建邮件状态通知

    一. 前提 前提: 服务器开启邮箱服务: 二. 基础配置 需要安装一个插件: 插件: Email Extension Plugin 进行配置: 系统管理->系统设置-> 相关配置如下图: ...

  4. js遍历table和gridview

    //遍历table var tableObj = document.getElementById("tableName");var str = "";for(v ...

  5. spring boot CrossOrigin不生效?

    直接postman, curl, 浏览器访问后端接口, response header是不会自动加上Access-Control-Allow-Origin的. 需要在ajax中调用,客户端reques ...

  6. es6数组新方法

    (1)Array.from(aarr,fn,obj) function fn(dr, sd, d) { /*Array.from 类数组转化为数组*/ console.log(arguments) v ...

  7. 《mac的git安装手册-2》

    <mac的git安装手册-2> 下载地址 https://git-scm.com/downloads 如果遇到打不开的情况,请在系统偏好设置内——>安全性与隐私下 ——>选择仍 ...

  8. python django bootstrap_导入 201901

    参考 http://www.liujiangblog.com/course/django/124 AdminLTE-2.4.5 http://www.liujiangblog.com/course/d ...

  9. SQL---MySQL数据库---聚合函数

    1.数值 format(x,n) 将x格式化为  由逗号分隔,小数点后n 位的数:

  10. 如何使用python将二维数组去重呢?

    二维数组的去重,能和一维的方法类似吗?import numpyc=np.array(((1,2),(3,4),(5,6),(7,8),(7,8),(3,4),(1,2)))print('二维数组:\n ...