名词解释
数学与逻辑学
中,singleton
定义为:有且仅有一个元素的集合。
单例模式最初的定义出现在《设计模式》(艾迪生维斯理,1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点。"
动机
对于系统中的某些类来说,只有一个实例很重要:
例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。
如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。
因此有时确保系统中某个对象的唯一性即一个类只能有一个实例
非常重要。
要点
根据定义,显然单例模式的要点有三个:
- 某个类只能有一个实例;
- 它必须自行创建这个实例;
- 它必须自行向整个系统提供这个实例。
从具体实现角度来说:
- 单例模式的类只提供私有的构造函数;
- 类定义中含有一个该类的静态私有对象;
- 该类提供了一个静态的公有函数用于创建或者获取它本身的静态私有对象。
饿汉式
根据名字就可以知道:饿汉,
因为饿,所以猴急,巴不得第一时间就把食物送到嘴边;
因此,这个模式的单例模式唯一的实例是在主函数运行之前就产生了的!
实现方式
根据上述要点,不难实现如下代码:
class Singleton
{
public:
static Singleton *getinstance()
{
return &instance;
}
private:
static Singleton instance;
Singleton() {
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
Singleton Singleton::instance;
运行结果
通过如下测试代码,我们来看饿汉单例模式的结果: