单例模式
单例模式(Singleton Pattern)是一个比较简单的设计模式,其定义如下:
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
Singleton类称为单例类,通过将构造函数标记为private,确保在一个应用中只产生一个实例、并且是自行例化的。
饿汉模式
单例对象在系统启动时就被创建,其实现简单、线程安全,无需考虑多线程情况下的同步问题,缺点是无法进行懒加载,当单例对象初始化所用时间很长时,会给系统带来显著的开销。
class Singleton
{
public:
static Singleton* GetInstance() //通过调用GetInstance() 在类外获得实例
{
return &_slt; //返回这个实例的地址
}
private:
static Singleton _slt; //类内声明
Singleton() {}
//禁用拷贝构造和赋值重载
Singleton(const Singleton& hs) = delete;
Singleton& operator=(const Singleton& hs) = delete;
};
Singleton Singleton::_slt(); //类外初始化
懒汉模式
单例对象在被调用时才会被创建,节省资源;多线程情况下存在线程安全问题。
class Singleton
{
public:
static Singleton* GetInstance()
{
static Singleton slt();
//静态函数每次只会初始化一次 所以只会在第一次调用时初始化
return &slt;
}
private:
//因为要实现单例类(全局只能有一个对象,因此要将构造函数私有化否则可以在类外随便创建)
Singleton() {}
//禁用拷贝构造和赋值重载
Singleton(const Singleton& hs) = delete;
Singleton& operator=(const Singleton& hs) = delete;
};
当系统并发量增大时,可能例化出多个对象:线程A执行例化操作时,还没有获得对象,线程B也执行到此处,其判断到对象没有被例化,因此也执行例化动作,最终得到两个对象。
上述代码使用静态局部变量初始化的单例是线程安全的,在C++11及之后版本中,这个保证由C++标准提供。