动机:
1、在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保他们的逻辑正确、以及良好的效率。
2、如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
3、这应该是类设计者的责任,而非使用者的责任。
模式定义:
保证一个类仅有一个实例,并提供一个改实例的全局访问点。
结构:
相当于将整个类的构造函数和析构函数置于private,使得该类无法被实例化,然后在类中定义一个静态的成员变量,该变量就是该类唯一的一个对象,可以通过Instance函数获得其句柄,在程序中正常调用。
Singleton |
static Instance()--------------------------------->return uniqueInstance SingletonOperation() GetSingletonData() |
static uniqueInstance singletonData |
要点总结:
1、Singleton模式中的实例构造器可以设置为protected以允许子类派生
2、Singleton模式一般不要支持拷贝构造函数和Clone接口(可以让函数=delete),因为这有可能导致或多个对象实例,与Singleton模式的初中违背。
3、通过加互斥锁实现在多线程环境下安全的Singleton,注意双检查说的正确实现(双检查锁可能由于new实现的步骤实在执行类构造之前就把分配好的对象交给变量,导致了错误)