1. 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。

2. 当仅允许类的一个实例在应用中被创建的时候,我们使用单例模式(Singleton Pattern)。它保护类的创建过程来确保只有一个实例被创建,它通过设置类的构造方法为私有(private)来实现。要获得类的实例,单例类可以提供一个方法,如getInstance,来返回类的实例。该方法是唯一可以访问类来创建实例的方法。例如:

C++代码:

//Singleton.h
class Singleton
{
public:
static Singleton* GetInstance();
private:
Singleton() {}
static Singleton *m_pInstance;
};
//Singleton.cpp
Singleton* Singleton::m_pInstance = NULL;
Singleton* Singleton::GetInstance()
{
if(m_pInstance == NULL)
m_pInstance = new Singleton();
return m_pInstance;
}

该类有以下特征

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

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

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

3. 但它仍然存在问题,m_pInstance指向的空间什么时候释放呢?更严重的问题是,这个实例的析构操作什么时候执行? 如果在类的析构行为中有必须的操作,比如关闭文件,释放外部资源,那么上面所示的代码无法实现这个要求。我们需要一种方法,正常地删除该实例。

妥善的方法是让类自己在合适的时候把自己删除

程序在结束的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在C++单例模式类中定义一个这样的静态成员变量,而它的唯一工作就是在析构函数中删除单例类的实例。如下面的代码中的CGarbo类(Garbo意为垃圾工人):

class Singleton
{
// 其它成员
public:
static Singleton * GetInstance(){。。。}
private:
Singleton(){};
static Singleton * m_pInstance;
class CGarbo // 它的唯一工作就是在析构函数中删除CSingleton的实例
{
public:
~CGarbo()
{
if (Singleton::m_pInstance)
delete Singleton::m_pInstance;
}
};
static CGarbo Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数
}

类CGarbo被定义为CSingleton的私有内嵌类,以防该类被在其它地方滥用。

在程序运行结束时,系统会调用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。

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

◆在单例类内部定义专有的嵌套类

◆在单例类内定义私有的专门用于释放的静态成员

◆利用程序在结束时析构全局变量的特性,选择最终的释放时机。

◆使用C++单例模式的代码不需要任何操作,不必关心对象的释放。

最新文章

  1. CSS3多列/多卷
  2. 【转】Microsoft .NET Framework 3.5 sp1 安装速度慢,快速离线安装的方法
  3. js二级导航下拉菜单
  4. [转]Oracle版本号解释
  5. 如何查看JSP和Servlet版本
  6. MySQL数据库的主从同步实现及应用
  7. 《zw版Halcon与delphi系列原创教程》发布说明
  8. Android BroadcasetReceiver
  9. Eclipse插件收藏列表
  10. Test for open live write
  11. arm的一些概念(ARM7、Cortex-M的区别)
  12. Ubuntu 创建启动器
  13. FPGA编程基础(一)--參数传递与寄存器使用
  14. node.js基础
  15. 《你必须掌握的Entity Framework 6.x与Core 2.0》书籍出版
  16. bash语法
  17. 【推荐】使用Ultrapico Expresso学习正则表达式
  18. linux各种系统下载地址
  19. WPF圆角按钮与触发颜色变化
  20. Group精确定位(canvas定位)

热门文章

  1. hive中行转换成列以及hive相关知识
  2. PlantUML——3.Graphviz的安装
  3. PHP学习笔记之数组游标操作
  4. Webmin忘记密码解决方法,及配置文件介绍
  5. leetcode 之Sum系列(七)
  6. IEEEXtreme 10.0 - Mancala'h
  7. Codeforces Round #302 (Div. 1) D - Road Improvement 树形dp
  8. PHP 5.4 内置 web 服务器
  9. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
  10. React Native 系列(三)