QT单例模式简单讲解与实现

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。在QT开发中,单例模式常用于管理全局资源,如配置管理、日志系统等。

最简单的QT单例实现

方法一:静态局部变量实现(C++11及以上推荐)

复制代码
class Singleton
{
public:
    // 获取单例实例的静态方法
    static Singleton& getInstance()
    {
        static Singleton instance;  // 线程安全的静态局部变量(C++11起)
        return instance;
    }

    // 示例方法
    void doSomething(const QString &message)
    {
        qDebug() << "Singleton is doing something"<<message;
    }

private:
    // 私有构造函数防止外部实例化
    Singleton() {}

    // 防止复制和赋值
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

​使用方式:​

复制代码
Singleton::getInstance().doSomething("Message 1");

如果你需要多次使用同一个实例,可以这样:

复制代码
Singleton &singleton= Singleton::getInstance();
singleton.doSomething("Message 1");
singleton.doSomething("Message 2");

方法二:指针实现(兼容旧版C++)

复制代码
class Singleton
{
public:
    static Singleton* getInstance()
    {
        if (!instance) {
            instance = new Singleton();
        }
        return instance;
    }

    void doSomething()
    {
        qDebug() << "Singleton is doing something";
    }

private:
    Singleton() {}
    static Singleton* instance;
};

// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;

​注意:​​ 这种方法不是线程安全的,如果需要线程安全,需要加锁。

QT特有的单例实现(Q_GLOBAL_STATIC)

QT提供了一个宏来更方便地实现单例:

复制代码
#include <QGlobalStatic>

Q_GLOBAL_STATIC(Singleton, singletonInstance)

class Singleton
{
public:
    void doSomething()
    {
        qDebug() << "Singleton is doing something";
    }

private:
    Singleton() {}
    friend class QGlobalStatic<Singleton>;
};

​使用方式:​

复制代码
singletonInstance()->doSomething();

为什么使用单例模式?

  • 控制资源访问(如配置文件)
  • 避免重复创建消耗资源的对象
  • 提供全局访问点

注意事项

  • 单例模式可能使代码更难测试
  • 过度使用会导致代码耦合度高
  • 考虑线程安全问题

以上就是在QT中实现单例模式的几种常见方法,第一种方法(静态局部变量)是最简单且线程安全的实现方式,推荐使用。

相关推荐
心一信息32 分钟前
如何在Ubuntu上部署excalidraw
linux·运维·ubuntu
鹿野素材屋41 分钟前
C#中对于List的多种排序方式
开发语言·c#
whxnchy1 小时前
C++刷题 - 7.27
开发语言·c++
白日梦想家-K1 小时前
题单【模拟与高精度】
开发语言·c++·算法
鹦鹉0072 小时前
IO流中的字节流
java·开发语言·后端
重生之我是Java开发战士2 小时前
【C语言】内存函数与数据在内存中的存储
c语言·开发语言·算法
haaaaaaarry2 小时前
Element Plus常见基础组件(二)
开发语言·前端·javascript
AI_RSER2 小时前
第一篇:【Python-geemap教程(三)上】3D地形渲染与Landsat NDVI计算
开发语言·python·3d·信息可视化·遥感·gee
WSSWWWSSW3 小时前
Python编程基础与实践:Python循环结构基础
开发语言·python
极客BIM工作室3 小时前
深入理解C++中的Lazy Evaluation:延迟计算的艺术
开发语言·c++