一.概念

单例模式:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

class CSingleton
{
//公有的静态方法,来获取该实例
public:
static CSingleton* GetInstance()
{if ( m_pInstance == NULL )  //判断是否第一次调用m_pInstance = new CSingleton();return m_pInstance;
}//私有构造函数,防止实例化
private:CSingleton(){};//私有静态指针变量,指向类的唯一实例
private:static CSingleton * m_pInstance; //声明一个静态成员
};CSingleton* CSingleton::m_pInstance = NULL; //定义并初始化静态数据成员int main()
{CSingleton* ps1 = CSingleton::GetInstance();CSingleton* ps2 = CSingleton::GetInstance();CSingleton* ps3 = ps1->GetInstance();CSingleton & ps4 = * CSingleton :: GetInstance(); if (ps1 == ps2){cout<< "ps1 = ps2"<<endl;}if (ps1 == ps3){cout<< "ps1 = ps3"<<endl;}if (&ps4 == ps1){cout<< "ps1 = ps4"<<endl;}return 0;
}

单例模式通过类本身来管理其唯一实例,唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。

用户访问唯一实例的方法只有 GetInstance() 成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。

有一点要注意:一定要加上 CSingleton* CSingleton::m_pInstance = NULL; 这一句,不然的话编译会出错,因为这一句才是变量定义。

二.单例类CSingleton 有以下特征

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

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

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

三.存在的问题

1.m_pInstance 指向的空间什么时候释放呢?

如果在类的析构行为中有必须的操作,比如关闭文件,释放外部资源,那么上面的代码无法实现这个要求。我们需要一种方法,正常的删除该实例。

不合理的解决方法:

在程序结束时调用 GetInstance(),并对返回的指针掉用 delete操作。这样做可以实现功能,但不仅很丑陋,而且容易出错。因为这样的附加代码很容易被忘记,而且也很难保证在delete之后,没有代码再调用 GetInstance 函数。也就是说释放操作由使用者来管理,而不是由类本身来管理,这违背了类的单一职责的原则,这是不合理的。

2. 该实例的析构函数什么时候执行?

上面的类里为什么没有析构函数,其实即便你加上析构函数也是可以的,但是这个析构函数不会被执行的。因为你的实例是 new 出来的,所以只有 delete 时,才会调用析构函数,但是在哪里调用 delete 呢!?这又回到了上面的问题。

一种妥善的方法:

class CSingleton
{
public:static CSingleton* GetInstance(){static CSingleton instance; //静态局部变量return &instance;}private:CSingleton() {}; //构造函数};

局部静态对象实例 instance 是第一次调用 GetInstance() 时被构造,一直保持活动状态直到应用程序终止,与动态分配对象不同,静态对象当应用程序终止时被自动销毁掉,所以就不必再手动销毁实例了。

当然这里,可以加上析构函数来处理你想要的操作。

这样做的要点有以下几点:

1. 静态变量在内存中只有一份,从而保证了单例模式中单一实例的要求。

2. 静态变量在程序终止时会被自动销毁,从而保证了空间正常释放。

设计模式C++描述----01.单例(Singleton)模式相关推荐

  1. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  2. Ruby设计模式透析之 —— 单例(Singleton)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8868758 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  3. 设计模式--单例(Singleton)模式

    模式意图 保证一个类只用一个实例,并且提供一个全局访问点 类图 应用场景 1.需要更严格地控制全局变量时,使用单例模式: 2.重量级的对象如线程池对象,数据库连接池对象,不需要多个实例的对象如工具类等 ...

  4. 设计一个线程安全的单例(Singleton)模式

    在设计单例模式的时候.尽管非常easy设计出符合单例模式原则的类类型,可是考虑到垃圾回收机制以及线程安全性.须要我们思考的很多其它.有些设计尽管能够勉强满足项目要求,可是在进行多线程设计的时候.不考虑 ...

  5. Java设计模式透析之 —— 单例(Singleton)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8860649 写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上 ...

  6. 单例/单体模式(Singleton)

    单例/单体模式(Singleton) 首先,单例模式是对象的创建模式之一,此外还包括工厂模式.单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3,向 ...

  7. 【设计模式】-创造篇-单例

    单例定义 单例模式(Singleton)是一种非常简单且容易理解的设计模式.顾名思义,单例即单一的实例,确切地讲就是指在某个系统中只存在一个实例,同时提供集中.统一的访问接口,以使系统行为保持协调一致 ...

  8. 单例测试模式中【饿汉式】与【懒汉式】的区别

    package day25.thread;/** /*** @author Mr Chen* @create 2018-10-09 18:37* 单例测试模式:保证类在内存中只有一个对象*/ publ ...

  9. 设计模式是什么鬼(单例)

    转自:设计模式是什么鬼(单例) 之前我们讲过面向对象以及封装.继承.多态三大特性,底子打好了那我们就把设计模式一个个拆开来看看到底都是神些什么鬼,我们先从简单的单例说起吧.单例,顾名思义,整个系统其实 ...

最新文章

  1. 68位高考状元真实身份曝光:最好的教育,是拼爹!
  2. hbase1.1.1 连接集群_除了HAProxy,RabbitMQ集群还可以这样用
  3. python基础教程第三版和第二版选哪个-python基础教程 2版和3版哪个适合新手?!...
  4. nginx的master和worker进程间的通信
  5. Bootstrap按钮使用
  6. DELL安装不了mysql_Windows 版本 Mysql 8.x 安装
  7. java生成world文件_HelloWorld.java文件如何创建?
  8. __set() And __get() 使用详解.
  9. 佳能fax_l150如何打印_佳能faxl150说明书下载
  10. 中兴的芯片,到底什么水平?
  11. 马云:遇见好老板很重要;锤子上海法人变更;摩拜更名美团单车 | 极客头条...
  12. 用python做简单的题目_「每日一练」巧用python做小学的数学题
  13. linux断点续传程序,Linux下怎么实现断点续传
  14. Ubuntu下如何安装Dynamips
  15. Java修改图片尺寸
  16. PHP CURL 使用代理 获取国外资源
  17. 自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃)...
  18. Java 基础类型 —— Short
  19. 序列化和反序列化 加上json数据流转换
  20. MyBatis从入门到精通(三):MyBatis XML方式的基本用法之多表查询

热门文章

  1. CPU维护及故障处理
  2. android 所有运行程序闪退,Android开发,运行app闪退的解决方法
  3. 利用百度文库实现精准引流
  4. 一个资深程序员看12306(四)
  5. 市场调研—全球及中国活化部分凝血活酶时间测试(APTT测试)行业研究及十四五规划分析报告
  6. ASP.NET mvcConf Videos Available
  7. java面试 系统调优_面试官:Java性能调优你会多少?一个问题就把我问的哑口无言,哭了!...
  8. less模块——math函数
  9. 哪些窗体置顶得程序是怎么实现得?
  10. 大四计算机系的,毕设该怎么下手?