意图
保证类只有一个实例,并提供一个访问它的全局访问点。
适用性
- 当类只能有一个实例而且客户可以通过一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类可扩展时
结构
优缺点
优点
1>对唯一实例的受控访问。因为singleton类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。
2>缩小名空间。singleton是对全局变量的一种改进,它避免了那些存储唯一实例的全局变量污染名空间。
3>允许对操作和表示的精化。singleton可以有子类,并且用这个扩展类的实例来配置一个应用是很容易的。
4>允许可变数目的实例。你可以用相同的方法来控制应用应有的实例数量,而不仅限于单例。
缺点
1>实际使用时可能有线程不安全的隐患存在。
实现
1>保证一个唯一的实例。常见的实现方法如下。
class Singleton
{
public:
//静态函数
static Singleton *getInstance();
protected:
//隐藏构造函数
Singleton();
private:
static Singleton *_instance = nullptr;
}
Singleton *Singleton::_instance = nullptr;
Singleton *SingleTon::getInstance()
{
//延时初始化
if(_instance == nullptr)
_instance = new Singleton();
return _instance;
}
2> 创建singleton的子类