2019独角兽企业重金招聘Python工程师标准>>>

单例模式的应用场景:

1、windows的任务管理器,无法打开两个任务管理器。

2、windows的回收站。

3、网站的计数器,一般也是采用单例模式实现,否则难以同步

4、 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

一、单例模式类CSingleton有以下几个特性:

1、它有一个指向唯一实例的静态指针m_pInstance,并且是私有的。

2、它有一个公有的函数,可以获取创建的这个唯一的实例,并且在需要的时候创建该实例。

3、它的构造函数是私有的,这样就不能从别处创建该类的实例。

代码如下:

class CSingleton
{
private:CSingleton()   //构造函数是私有的{}static CSingleton *m_pInstance;
public:static CSingleton * GetInstance(){if(m_pInstance == NULL)  //判断是否第一次调用m_pInstance = new CSingleton();return m_pInstance;}
};

二、m_pInstance指向的空间什么时候释放?该实例的析构函数什么时候执行?

1、需要知道一点:程序在结束的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量一样。

2、如上所述,我们可以利用这个特征,我们可以在单例类中定义一个这样的静态成员变量,而它的唯一工作就是在析构函数中删除单例类的实例。例如下面代码中的CGarbo类。(Garbo意为垃圾工人)

class CSingleton
{
private:CSingleton(){}static CSingleton *m_pInstance;class CGarbo   //它的唯一工作就是在析构函数中删除CSingleton的实例{public:~CGarbo(){if(CSingleton::m_pInstance)delete CSingleton::m_pInstance;}};static CGarbo Garbo;  //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数
public:static CSingleton * GetInstance(){if(m_pInstance == NULL)  //判断是否第一次调用m_pInstance = new CSingleton();return m_pInstance;}
};

CGaibo类是Csingleton类私有内嵌类,防止改类在别的地方被滥用。

程序结束的时候,系统会调用CSingleton类中的CGarbo类的析构函数,该析构函数会删除单例的唯一的实例。

使用这种方式释放单例对象有以下特征:

  1. 在单例类内部定义一个专有的嵌套类;
  2. 在单例类内定私有的专门用于释放的静态成员。
  3. 利用程序结束时析构全局变量的特征,选择最终的释放时机。
  4. 使用单例的代码不需要任何操作,不必关心对象的释放。

完整的代码如下:

#include <iostream>
using namespace std;  class CSingleton
{
public:  static CSingleton *GetInstance();
private:  CSingleton()  {  cout << "CSingleton ctor" << endl;  }  ~CSingleton()  {  cout << "CSingleton dtor" << endl;  }  static CSingleton *m_pInstance;class Garbo  {  public:  ~Garbo()  {  if (CSingleton::m_pInstance){  cout << "Garbo dtor" << endl;  delete CSingleton::m_pInstance;  }  }  };  static Garbo garbo;
};  CSingleton::Garbo CSingleton::garbo;  // 一定要初始化,不然程序结束时不会析构garbo
CSingleton *CSingleton::m_pInstance = NULL;
CSingleton *CSingleton::GetInstance()
{  if (m_pInstance == NULL)  m_pInstance = new CSingleton;  return m_pInstance;
}  int main()
{  CSingleton *p1 = CSingleton::GetInstance();  CSingleton *p2 = CSingleton::GetInstance();  if (p1 == p2)  cout << "p1 == p2" << endl;  return 0;
}  

补:

1、饿汉模式:

即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。

需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.

使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。

2、懒汉模式:

即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。

由静态初始化实例保证其线程安全性,WHY?因为静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。

故在性能需求较高时,应使用这种模式,避免频繁的锁争夺。

转载于:https://my.oschina.net/u/929521/blog/803342

设计模式_01单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  3. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  4. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  5. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  6. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  7. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

  8. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  9. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

最新文章

  1. 40条怼人不带脏字的句子
  2. 隧道凿岩机器人传感器_【谷企动态】天创电子管廊综合监控平台及机器人系统在国家电网项目顺利交付应用...
  3. Compound Interest Calculator4.0
  4. Coding:取若干个1到n的整数可求和等于整数m,求出所有组合的个数
  5. android 渲染流程
  6. 增长黑客系列:今天比昨天增长多少?快使用环比函数来分析日志
  7. 电脑可以开机但是黑屏_电脑开机后黑屏如何解决 电脑开机后黑屏解决方法【详解】...
  8. 微架构设计:微博计数器的设计
  9. linux下usb调试工具,LINUX USB调试
  10. sqlmap 用户手册(续)
  11. python 近期用到的基础知识汇总(四)
  12. 聚类算法分析及其性能比较
  13. 企业沟通工具实现高效信息化沟通模式
  14. STK X教程—C++/CLI
  15. 关于python变量使用下列说法中错误的是_关于Python中的全局变量和局部变量,以下描述中错误的是...
  16. Linux下切换capslock和control键
  17. 【web】百度地图中心点始终出现在左上角,或者灰蒙蒙的
  18. spring boot 作业管理系统
  19. code epi 光场_光场相机视觉测量误差分析
  20. 什么是哲学,兼谈如何理解道德经

热门文章

  1. Android P2P语音通话实现(思路探讨)
  2. 【安装配置】克隆方式安装Oracle数据库软件
  3. 《Effective Java》--Java进阶必备
  4. L1正则化与嵌入式特征选择(稀疏性)
  5. 【ora10,4】oracle后台进程介绍:
  6. Android APK文件解析
  7. 项目中js文件修改后浏览器不能及时更新的解决办法
  8. 双机热备篇 VRRP与VGMP的故事(2)
  9. linux ras目录,Linux下配置站点-FTP-RSA私钥-公钥
  10. python3 os.system 异步执行_《sentos python教程》 Python os.system(command),这样执行的command命令,和主程序是异步的吗?...