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

    主要关注访问pg.不关心其他db 1 clojure.java.jdbc https://github.com/clojure/java.jdbc http://clojure-doc.org/art ...

  2. 【实例分割】PANet简单笔记

    PANet是18年的一篇CVPR,作者来自港中文,北大,商汤与腾讯优图,PANET可看作Mask-RCNN+,是在Mask-RCNN基础上做的几处改进. 论文地址:https://arxiv.org/ ...

  3. firefox浏览本地网站慢的问题

    用火狐调试本地站点网站,总感觉有点迟钝 经查,原来是火狐会检测网站来源,具体工作原理不详 解决办法 依次打开:C:\Windows\System32\drivers\etc 用记事本或editplus ...

  4. Pandas基本功能详解

    Pandas基本功能详解 Pandas  Pandas基本功能详解 |轻松玩转Pandas(2) 参考:Pandas基本功能详解 |轻松玩转Pandas(2)

  5. Luogu P5122 [USACO18DEC]Fine Dining 最短路

    先跑一遍n为起点最短路,再新开一个点,向有干草垛的点连一根边权为d[u]-w的有向边(很重要..我当时连的无向边,然后我死了.),相当于用价值抵消一部分边权, 然后以这个新的点为起点跑最短路就好了.. ...

  6. echarts设置线条粗细

    series: [ { name:"buy", type:'line', data:[], itemStyle: { normal: { color: '#6cb041', lin ...

  7. asp.net mvc AjaxHelper 获取 JSON 的方法

    默认的 AjaxHelper 没有提供获取 JSON 的方法,只提供获取 html 然后更新指定元素的方法,不过,经测试发现还是有办法的,由于 AjaxOptions 对象的 OnSuccess 属性 ...

  8. iOS如何实时查看App运行日志

    Linux下管理挂载IOS设备——libimobiledevicehttps://www.jianshu.com/p/6423610d3293https://blog.csdn.net/fengzei ...

  9. xshell传输文件到linux

    我们使用xshell来连接linux之后会发现方便了很多~然而使用xshell要怎么把本地文件传到linux上面呢? 1.yum安装一款工具.#yum install  lrzsz -y 2检查是否安 ...

  10. Spring配置问题:The prefix "util" for element "util:map" is not bound.

    在spring的头部文件中没有引入: xmlns:util=”http://www.springframework.org/schema/util” 原文:https://blog.csdn.net/ ...