Content Table

单例

单例的意图是为了保证一个类只能创建一个对象(栈对象或者堆对象都可以),并提供访问它的唯一全局访问点。只需要一个对象的场景,比如数据库连接池、线程池、系统日志的输出、读写配置等。

为了保证一个类只有一个对象,那么就不能随便地创建和删除这个类的对象。如果它的构造函数是 public 的,那么就可以随意地创建它的对象了,所以它构造函数不能是 public 的。如果它的析构函数是 public 的,那么也可以调用 delete 删除它的对象。所以对于要使用单例的类,它的构造函数和析构函数我们都定义为 private 的,同时要防止通过拷贝构造函数和赋值操作创建对象。

先思考一下,什么情况下能访问一个类的 private 成员变量和成员函数?单例的实现需要用到这个知识点。

下面以读取配置文件的类 ConfigUtil 为例,提供五种单例的实现,从简单直观的实现开始,分析,思考,然后通过使用宏和模版实现代码的重用,最后简洁高效地实现单例。

  1. 单例的简单实现
  2. 单例的智能指针实现
  3. 单例的智能指针+宏的实现
  4. 单例的模版实现
  5. 单例的模版+宏的实现
  6. 单例的其他实现

在实际开发中,单例的实现推荐使用 3. 单例的智能指针+宏的实现 或者 5. 单例的模版+宏的实现,可以直接查看对应的章节,其他几个实现的目的是为了介绍优化代码的过程与思考,如果不感兴趣可以忽略它们,不会造成任何障碍。