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中实现单例模式的几种常见方法,第一种方法(静态局部变量)是最简单且线程安全的实现方式,推荐使用。

相关推荐
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁4 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超4 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int4 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
慧都小项4 天前
当边缘AI上产线:QtitanDocking 如何让工业 HMI 实现多视图协同
人工智能·qt·ui·边缘计算·qt6.3
CoderYanger5 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
伞伞悦读5 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json
CCCCCCCCharlie5 天前
Linux进程控制四大核心操作
linux·开发语言