好久没有写自己的学习小博客,罪过罪过。。最近本菜鸟在项目中接触到经常用到的设计模式,首先是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. zookeeper客户端使用第三方(zkclient)封装的Api操作节点

    1.引入依赖 <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</a ...

  2. 51Nod - 1242 斐波那契(快速幂)

    斐波那契数列的定义如下:   F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2)   (1, 1, 2, 3, 5, 8, 13, 21, ...

  3. redis备份恢复

    redis的几种数据导入导出方式[转]   环境说明:202.102.221.11 redis源实例202.102.221.12 redis目标实例202.102.221.13 任意linux系统 一 ...

  4. 阿里Java开发规约(1)

    本文是对阿里插件中规约的详细解释一,关于插件使用,请参考这里 1. ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常. 说明:禁止 ...

  5. windows logstash配置

    E:\logstash-6.2.4\bin目录下新建logstash.conf input { stdin { } } output { stdout { codec=> rubydebug } ...

  6. WindowsMTU修改

    MTU是英文Maximum Transmission Unit的缩写,意为"最大传输单位".也就是通过TCP/IP协议所传输的数据包最大有多少字节,对于网速有极大的影响, MTU并 ...

  7. Mysql 查看表数据以及索引大小

    如果想查看 Mysql 数据库的总的数据量或者某个表的数据或者索引大小,可以使用系统库 information_schema 来查询,这个系统库中有一个 TABLES 表,这个表是用来记录数据库中表的 ...

  8. java——删除链表中等于给定值的所有元素

    class ListNode{ int val ; ListNode next; public ListNode(int x) { val = x; } public ListNode(int[] a ...

  9. SQL SEVER 数据库日志(Log)文件增长过快的处理

    SQL SERVER 2016数据库,50GB+的数据.有大量的增删和插入操作,数据库log文件变得异常的大,而且增长速度特别的快.周五log文件20GB,周一上班就成了200+GB了 因为数据库恢复 ...

  10. Vue自定义指令实现按钮级权限控制功能

    思路: 登录:当用户填写完账号和密码后向服务端验证是否正确,验证通过之后,服务端会返回一个token,拿到token之后(我会将这个token存贮到sessionStorage中,保证刷新页面后能记住 ...