一、饿汉模式
// 保证全局(整个进程)只有唯一实例对象
// 饿汉模式 : 一开始就创建对象,特点简单
// 缺陷1:
// 多个单例对象A B C,假设要求他们之间有依赖关系:依次创建初始化A 、 B 、 C
// 饿汉模式无法保证顺序
// 缺陷2:可能会导致程序启动慢
class Singleton
{
public:
Singleton& GetInstance()
{
return _sins;
}
private:
Singleton()
{}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton _sins;
};
Singleton Singleton::_sins;
二、懒汉模式
// 懒汉模式: 第一次调用的时候才会创建初始化实例对象
// 相对复杂一些
class Singleton
{
public:
Singleton* GetInstance()
{
// 双检查
if (_psins == nullptr) // 效率
{
unique_lock<mutex> lock(_mtx);
if (_psins == nullptr) // 线程安全
{
_psins = new Singleton;
}
}
return _psins;
}
private:
Singleton()
{}
//封死它的拷贝构造和赋值函数
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
//定义它的全局静态对象
static Singleton* _psins;
static mutex _mtx;
};
//初始化它的对象,使其实例化
Singleton* Singleton::_psins = nullptr;
//初始化锁
mutex Singleton::_mtx;