前言
开发过程中,采用合适的设计模式,可事半功倍。并且方便维护更新。
单例模式
单例模式主要是确保一个类只有一个实例,自行实例化并向系统提供这个实例 。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 单例模式分为 "懒汉"和"饿汉"俩种。
单例模式-“懒汉”
懒单例模式的特点就是延迟加载,即调用时才实例化。
#include <QSharedPointer>
class LazySingleton
{
public:
static QSharedPointer<LazySingleton>& GetInstance()
{
if ( nullptr == m_pInstance )
m_pInstance = QSharedPointer<LazySingleton>(new LazySingleton());
return m_pInstance;
}
private:
LazySingleton(){}
private:
static QSharedPointer<LazySingleton> m_pInstance;//智能指针,自动释放
};
// 静态成员变量需要在类体的外面进行初始化
QSharedPointer<LazySingleton> LazySingleton::m_pInstance = nullptr;
单例模式-“饿汉”
饿单例模式的特点就是预加载,即实例在类装载时就构建。
#include <QSharedPointer>
class HungrySingleton
{
public:
static QSharedPointer<HungrySingleton>& GetInstance()
{
return m_pInstance;
}
private:
LazySingleton(){}
private:
static QSharedPointer<HungrySingleton> m_pInstance;
};
// 直接初始化静态成员变量
QSharedPointer<HungrySingleton> HungrySingleton::m_pInstance = QSharedPointer<HungrySingleton>(new HungrySingleton());
饿单例模式最简单的写法为
class HungrySingleton
{
public:
static HungrySingleton& GetInstance()
{
static HungrySingletonm_pInstance;
return m_pInstance;
}
private:
HungrySingleton(){}
};
总的来讲,懒单例模式是时间换空间,饿单例模式是空间换时间。
上面是最简单的写法,但是有的时候需要考虑线程安全,乱序执行等问题。
有兴趣可以点击参考 单例模式-乱序执行-原子操作