单例模式
1. 意图
- 保证一个类仅有一个实例。
- 提供一个访问它的全局访问点。
2. 适用场景
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
3. 应用实例
- 一个班级只有一个班主任。
- 在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
4. 类图
说明
定义一个Instance
操作,允许客户访问它的唯一实例。在C++中,它是一个静态成员函数。同时,该操作可以负责创建它自己的唯一实例。
5. 优点
- 对唯一实例的受控访问
- 缩小命名空间
- 允许对操作和表示的精华
- 允许可变数目的实例
- 比类操作更灵活
5. 实现
Singleton.h
#ifndef DEBUG_SINGLETON_H
#define DEBUG_SINGLETON_H
#include <iostream>
class Singleton {
public:
static Singleton *Instance(); // 共有静态成员方法(全局访问点)
void method();
protected:
Singleton(); // 保证了不能通过构造函数来创建对象实例
private:
static Singleton *_instance; // 私有静态成员
};
#endif //DEBUG_SINGLETON_H
Singleton.cpp
#include "Singleton.h"
using std::cout;
using std::endl;
Singleton *Singleton::_instance = nullptr;
Singleton *Singleton::Instance() {
if (_instance == nullptr) {
cout << "初始化了单例!" << endl;
_instance = new Singleton();
}
return _instance;
}
void Singleton::method() {
std::cout << "调用了实例方法!" << std::endl;
}
Singleton::Singleton() = default;
main.cpp
#include "Singleton.h"
int main() {
Singleton *uniqueInstance = Singleton::Instance();
uniqueInstance->method();
return 0;
}
执行结果
初始化了单例!
调用了实例方法!
Singleton
类中的静态成员方法Instance()
是对外暴露的全局访问点,外界想要访问这个类的实例时,只能通过这个方法。