创建型模式3-单例模式
单例模式(singleton)
意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
问题思考
假如你是某移动设备系统的设计者,考虑向开发者开放电池的API。由于移动设备通常只有一个电源,保证开发者只能获取一个电源管理器(PowerManager)。普通的new显然不能满足我们的要求。
适用性
- 当类只能有一个实例而且客户可以从一个public接口访问它的时候。
类图
singleton实现
线程不安全版:
class Singleton {
public:
Singleton *GetInstance() {
if (!sInstance) {
sInstance = new Singleton();
}
return sInstance;
}
void Operation1();
void Operation2();
protected:
Singleton() {...};
protected:
static Singleton *sInstance = nullptr;
};
线程安全版:
#include<mutex>
class Singleton {
public:
Singleton *GetInstance() {
if (!sInstance) {
{
std::lock_guard<std::mutex> lk(sMutex);
if (!sInstance) {
sInstance = new Singleton();
}
}
}
return sInstance;
}
// ...
protected:
Singleton() {...};
protected:
static Singleton *sInstance;
static std::mutex sMutex;
};
Singleton *Singleton::sInstance = nullptr;
std::mutex Singleton::sMutex;
单例模式和子类的问题
但Singleton有子类(可能不止一个)的时候,创建一个唯一的子类实例并不简单,往往有可能创建多余的实例(其他子类的实例)。
网友评论