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

相关推荐
松涛和鸣16 小时前
14、C 语言进阶:函数指针、typedef、二级指针、const 指针
c语言·开发语言·算法·排序算法·学习方法
智商低情商凑21 小时前
Go学习之 - Goroutines和channels
开发语言·学习·golang
半桶水专家21 小时前
Go 语言时间处理(time 包)详解
开发语言·后端·golang
编程点滴21 小时前
Go 重试机制终极指南:基于 go-retry 打造可靠容错系统
开发语言·后端·golang
实心儿儿21 小时前
C++ —— 模板进阶
开发语言·c++
萧鼎21 小时前
Python PyTesseract OCR :从基础到项目实战
开发语言·python·ocr
q***23571 天前
RabbitMQ介绍以及基本使用
qt·rabbitmq·ruby
二川bro1 天前
第57节:Three.js企业级应用架构
开发语言·javascript·架构
sali-tec1 天前
C# 基于halcon的视觉工作流-章62 点云采样
开发语言·图像处理·人工智能·算法·计算机视觉
王宪笙1 天前
Qt之数据库使用示例
数据库·qt