Qt 设计模式之单例模式

630 阅读1分钟

一、概述

一个类只有一个对象,有利于我们协调系统整体的行为。

二、引入头文件

#include <QMutex>

三、介绍

由于一个类只能拥有一个实例化的对象,因此不能用 new 来新建对象,那么要把构造函数声明为私有的。

GetInstance 是用来获取单例对象的一个方法。

在类中添加一个私有静态成员变量用于保存单例实例, 如果单例的初始值为 NULL,那么我们就构建单例对象然后返回,这个方法称为懒汉模式

QMutex 的目的是同一时间只有一个线程可以访问。

四、代码

4.1 头文件

/// @class 单例类
class Singleton
{
public:
    /// @brief 获取单例对象
    static Singleton* GetInstance();

private:
    /// @brief 构造函数私有声明
    Singleton();

    static Singleton *m_instance; // 持有唯一实例,保证全局唯一性
    static QMutex m_mutex;        // 实例互斥锁
}

4.2 cpp 文件

// ------------------------
QMutex  Singleton::m_mutex;
Singleton* Singleton::m_instance = NULL; // 懒汉模式

// --------------------------------
Singleton* Singleton::GetInstance()
{
    // 双重检测机制
    if(m_instance == NULL)  
    {
        // 加互斥锁
        QMutexLocker locker(&m_mutex);    
        
        // 第二次检测
        if(!m_instance)
        {
            m_instance = new Singleton;
        }
    }
    return m_instance;
}