【C++设计模式之单例模式SingletonPattern】
文章目录
- 动机(Motivation)
- 一、模式定义
- 二、问题
- 1.保证一个类只有一个实例
- 2.为该实例提供一个全局访问节点
- 三、结构
- 四、代码实现
动机(Motivation)
- 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率。
- 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
- 这应该是类设计者的责任,而不是使用者的责任。
一、模式定义
保证一类类仅有一个实例,并提供一个该实例的全局访问点。——《设计模式》GoF

二、问题
单例模式同时解决了两个问题, 所以违反了单一职责原则:
单一职责原则(SRP)
- 一个类应该仅有一个引起它变化的原因。
- 变化的方向隐含着类的责任。
1.保证一个类只有一个实例
- 为什么会有人想要控制一个类所拥有的实例数量? 最常见的原因是控制某些共享资源 (例如数据库或文件) 的访问权限。
- 它的运作方式是这样的: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。
注意, 普通构造函数无法实现上述行为, 因为构造函数的设计决定了它必须总是返回一个新对象。

2.为该实例提供一个全局访问节点
- 还记得你 (好吧, 其实是我自己) 用过的那些存储重要对象的全局变量吗? 它们在使用上十分方便, 但同时也非常不安全, 因为任何代码都有可能覆盖掉那些变量的内容, 从而引发程序崩溃。
- 和全局变量一样, 单例模式也允许在程序的任何地方访问特定对象。 但是它可以保护该实例不被其他代码覆盖。
- 还有一点: 你不会希望解决同一个问题的代码分散在程序各处的。 因此更好的方式是将其放在同一个类中, 特别是当其他代码已经依赖这个类时更应该如此。
三、结构


单例 (Singleton) 类声明了一个名为 getInstance获取实例的静态方法来返回其所属类的一个相同实例。
单例的构造函数必须对客户端 (Client) 代码隐藏。 调用 获取实例方法必须是获取单例对象的唯一方式。
四、代码实现
class Singleton {
public://防止拷贝和赋值Singleton(const Singleton&) = delete;Singleton&operator=(const Singleton&) = delete;static Singleton&getInstance() {// C++11保证局部静态变量线程安全static Singleton instance;return instance;}private:Singleton() = default;~Singleton() = default;// 自动调用析构,无需手动delete
};