单例模式
一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。
饿汉模式
程序启动时就创建一个唯一的实例对象。
class Singleton
{
static Singleton* getInstance()
{
return &instance;
}
private:
Singleton()
{}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton instance;
};
Singleton Singleton::instance;
懒汉模式
程序运行第一粗使用实例对象式,创建对象。
注意:
这里一定要使用Double-Check的方式加锁,才能保证效率和线程安全。
通过加锁保证线程安全,double-check保证只有在第一次创建时才需要加锁,如果已经创建过可以直接使用。
class Singleton
{
static Singleton* getInstance()
{
if (instance == nullptr)
{
mtx.lock();
if (instance == nullptr)
{
instance = new Singleton();
}
mtx.unlock();
}
return instance;
}
private:
Singleton()
{}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton* instance;
static mutex mtx;
};
Singleton* Singleton::instance = nullptr;
mutex Singleton::mtx;