意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用性
在以下情况下可以使用 Singleton 模式:
- 当类只能有一个实例并且用户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且用户应该无需更改代码就能使用一个扩展的实例时。
结构
Singleton:定义一个 Instance 获取实例的操作,允许用户访问它的唯一实例。用户只能通过 Singleton 的 Instance 操作访问一个 Singleton 实例。
细则
- 封装了对唯一实例的受控访问。
- Singleton 模式是对全局变量的一种改进,避免了存储唯一实例的全局变量污染名空间。
- 允许对操作和表示的精化。Singleton 类可以有子类,通过扩展类在运行时刻配置应用。
- 允许可变数目的实例。控制应用所使用的实例的数目。
- 比类操作更灵活。比如使用静态成员函数。
- 可以将构造设为非 public,避免在外部创建新的实例。
- 对于饿汉模式,可以作为静态成员变量,在程序初始化时构建;对于懒汉模式,可以在函数中初始化 static 变量,这在 C++11 之后是线程安全的。
代码示例
#include <iostream>
class Singleton
{
private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
//在调用getInstance时初始化
static Singleton* getInstance() {
static Singleton instance;
return &instance;
}
};
int main()
{
Singleton* instance = Singleton::getInstance();
system("pause");
return 0;
}
相关模式
很多模式可以使用 Singleton 模式实现。例如:Abstract Factory 可以设计为 Singleton 实例。
参照
书籍:GOF《设计模式:可复用面向对象软件的基础》
视频:李建忠设计模式(版权问题,自行搜索)