• 简单介绍

单例模式(Singleton Pattern)是一种常见的软件设计模式,在使用这个模式时,单例对象的类必须保证在全局中有且只有一个实例存在,并且提供了一个全局访问的接口,这样有利于我们协调系统整体的行为。

  • 应用场景

1.在某个服务器程序中,所以的配置数据都在一个文件中存放,这时可以统一使用一个单例对象对配置进行读取,然后其他的模块都可以调用该对象来对获取当前配置信息

2.在windows下,任务管理器就是单例模式的经典应用之一,保证整个系统只能有一个Task Manager的对象。

3.许多windows应用程序存在着系统托盘,这个也是单例模式的一种应用,隐藏在右下角方便用户进行操作。整个exe中有且只有一个托盘对象,防止程序多开导致的一系列bug,比如说已经运行当前exe,在双击打开程序是不会被再拉起一个登录界面。

4.多线程的线程池对象一般是使用的单例模式,这样方便对池冲的线程进行管理。

  • 具体实现

由于目前正在做客户端开发,所以本文在WIN32平台下实现,顺便简单介绍一下windows防多开的实现,在windows下有许多程序在设计时是不允许用户多开的,那么如何实现呢?在这里分享一个windows下的解决方案:互斥体防多开。主要原理是使用WIN32 API CreateMutexW函数

 CreateMutexW( _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, _In_ BOOL bInitialOwner, _In_opt_ LPCWSTR lpName);

来生成一个与当前程序相关的互斥体,当再次运行是会检测当前互斥体是否再运行,如果是则退出程序,关于CreateMutexW函数的用法网上有许多博客介绍,这里具体说明下lpName参数的作用,lpName主要是作为互斥体名称传入参数的,那么这个参数该如何选择呢?这个时候可以使用uuid, uuid是一个根据标准方法生成、不依赖中央机构的注册和分配且具有全网唯一的一个128位标识符,使用这个作为互斥体的名称可以做到真正的互斥。下面说说具体实现:

  1. 首先需要定义一个对象的结构体,用于存放文件句柄以及判断是否在单例模式下。
  2. 构造函数的设计主要是使用唯一uuid作为单例对象的互斥名称,创建了程序的句柄,调用此函数时,可以把本地生成的uuid当作函数参数key传入,根据GetLastError()函数返回值来确定m_inMode的值。
  3. 析构函数的设计就比较简单了,可以先判断是否在单例模式下,如果是则关闭当前文件句柄即可
struct SingletionMode::Context {bool m_inMode;HANDLE m_hMutex;
};// 单例模式
struct SingletionMode {//句柄struct Context;SingletionMode(const std::wstring &key);virtual ~SingletionMode();private:std::shared_ptr<Context> m_context;
};//构造函数
SingletionMode::SingletionMode(const std::wstring &key) {m_context = std::make_shared<Context>();m_context->m_hMutex = CreateMutexW(nullptr, FALSE, key.c_str()); //创建实例句柄auto dwError = GetLastError();m_context->m_inMode = (ERROR_ALREADY_EXISTS == dwError || ERROR_ACCESS_DENIED == dwError);
}//析构函数
SingletionMode::~SingletionMode() {closeValidHandle(m_context->m_hMutex);    //这里定义一个函数关闭实例句柄
}

单例模式 Windows下防止多开简介相关推荐

  1. Windows下Core_Audio_APIs的使用简介

    Windows Vista 之后系统,音频系统相比之前的系统有很大的变化,产生了一套新的底层 API 即 Core Audio APIs .该低层 API 为高层 API( 如 Media Found ...

  2. windows下使用nginx调试简介

    安装使用 nginx是一个反向代理服务器,在web开发调试中经常用到,写一个简单的使用说明和总结. 1. 下载 点击官网下载地址 下载对应版本的nginx并解压 2. 配置 在解压的目录下找到conf ...

  3. NoSQL和Redis简介及Redis在Windows下的安装和使用教程

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/103.html?1455869099 NoSQL简介 介绍redis前,我 ...

  4. Windows之Chocolatey:windows下的apt-get即Chocolatey简介、安装、使用方法之详细攻略

    Chocolatey简介 Chocolatey 是 windows 下一款命令行包管理软件 ,简单说这就是 Windows 的 apt-get.习惯 Linux 操作方式并非常想用它操纵 Window ...

  5. CRF++使用简介(windows下非接口)

    CRF简介 CRF++是著名的条件随机场的开源工具,也是目前综合性能最佳的CRF工具. CRF 的工具有两种,一种是支持Linux环境的,一种是支持Windows环境的,大家可以自行根据自己的系统进行 ...

  6. IPP简介及windows下安装说明

    IPP简介及windows下安装说明 专栏目录 说明 一.IPP简介 二.windows7和windows10下安装说明 1.windows10下安装 (1)oneAPI集成安装 (2)单独下载安装 ...

  7. Windows下创建进程简介

    正在执行的应用程序称为进程,进程不仅仅是指令和数据,它还有状态.状态是保存在处理器寄存器中的一组值,如当前执行指令的地址.保存在内存中的值,以及唯一定义进程在任一时刻任务的所有其他值.进程与应用程序的 ...

  8. GDAL库简介以及在Windows下编译过程

    GDAL(Geospatial Data Abstraction Library,地理空间数据抽象库)是一个在X/MIT许可协议下的开源栅格空间数据转换库.官网http://www.gdal.org/ ...

  9. Flex和Bison简介和Windows下使用入门

    flex用作词法分析,而bison用作语法分析.词法分析把输入分解成一个个有意义的词块,称作token:语法分析则确定这些词块彼此之间如何关联(使用语法树表达). Flex可生成词法分析器:Bison ...

最新文章

  1. gaokao--选择开发什么项目
  2. python种颜色循环_Python 实现一个颜色色值转换的小工具
  3. 前端学习(3020):vue+element今日头条管理--创建路由和配置路由
  4. Linux软中断、tasklet和工作队列
  5. 那些很重要,但是不常用的技术,websocket
  6. 微信小程序——实现时钟样式
  7. hibernate 实现数据库查询
  8. JAX-RS 2.0 REST客户端编程实例
  9. linux aria2磁力链接,Linux一键安装Aria2+Yaaw+FileManager实现BT磁力下载,并在线查看/观看...
  10. VB类计算机专业毕业设计题目
  11. Word文档 公式换行 小技巧
  12. 经纬财富:开封如何炒现货白银
  13. linux上热编译react,reactos终于被成功编译通过
  14. MATLAB图形的实验原理,信息隐藏实验1
  15. arduino使用晶联讯jlx12864
  16. python中字典的循环遍历的方式
  17. SecureCRT查看日志乱码
  18. python byte类型_Python3的字节类型(bytes)
  19. pta 1144 The Missing Number
  20. layui的css文件自己写的吗_你知道怎么给自己的CAD图纸文件加密吗?

热门文章

  1. Nginx通俗易懂教程
  2. 谷歌地图获取点击时候的具体经纬度api
  3. BI可视化分析之Pentaho
  4. 人际关系-《别独自用餐》书中的精髓:通过有效的社交法则,改变社交行为固有模式,建立更有价值的人脉关系,从而获取更大成功。
  5. GeoServer结合FWTools切片工具发布影像金字塔切片
  6. 单片机七阶音符_单片机 演奏音符
  7. Win10隐藏状态栏图标的方法
  8. Java各种运算符号的含义及区别汇总
  9. 计算机打字失灵,电脑键盘在打字的时候出现按键失灵的原因是什么
  10. 保险怎么买?有哪些销售渠道?各自的优缺点是什么?