单例模式(Singleton Pattern)

单例模式(Singleton Pattern)

任务管理器可以作为一个全局的任务配置管理类,使用单例模式保证全局只有一个实例。这样你可以避免在应用程序中创建多个任务管理对象,保持配置参数的统一。

示例:
cpp 复制代码
class TaskManager {
private:
    static TaskManager *instance;
    TaskManager() {}  // 私有构造函数

public:
    static TaskManager* getInstance() {
        if (instance == nullptr) {
            instance = new TaskManager();
        }
        return instance;
    }

    // 任务管理方法
    void saveTaskTemplate(const TaskParameters &task, const QString &filename) {
        task.saveToFile(filename);
    }

    // 其他任务方法...
};

TaskManager* TaskManager::instance = nullptr;

或者

cpp 复制代码
class SystemConfig {
public:
    // 提供一个全局访问点,返回唯一的实例
    static SystemConfig& instance() {
        static SystemConfig instance;  // 静态局部变量,确保只初始化一次
        return instance;
    }

    // 系统配置相关参数
    QString systemSetting1;
    int systemSetting2;

    // 设置和获取系统配置的方法
    // 可以在这里添加一些方法来操作配置参数

private:
    // 私有构造函数,确保外部不能直接创建实例
    SystemConfig() {}

    // 禁用复制构造函数
    SystemConfig(const SystemConfig&) = delete;

    // 禁用赋值运算符
    void operator=(const SystemConfig&) = delete;
};
cpp 复制代码
#include <iostream>
#include <QString>

int main() {
    // 获取单例实例
    SystemConfig& config = SystemConfig::instance();

    // 设置配置参数
    config.systemSetting1 = "Hello, World!";
    config.systemSetting2 = 42;

    // 输出配置参数
    std::cout << "System Setting 1: " << config.systemSetting1.toStdString() << std::endl;
    std::cout << "System Setting 2: " << config.systemSetting2 << std::endl;

    return 0;
}

这个代码实现的是 单例模式(Singleton Pattern) ,它的目的是确保在程序中只有一个 TaskManager 实例存在,并提供一个全局访问点来获取这个实例。

关键概念:

  • 单例模式 是一种设计模式,它通过控制实例的创建,确保类只有一个实例,并提供一个访问该实例的全局入口。
  • 在这个代码中,TaskManager 类就是一个单例类,它通过私有化构造函数和静态成员变量来确保只有一个 TaskManager 对象被创建。

代码解析

1. 静态成员变量
cpp 复制代码
static TaskManager* instance = nullptr;
  • instance 是一个静态成员变量,它保存了 TaskManager 类的唯一实例。
  • 静态变量意味着它在所有的类实例中是共享的,因此它不会随对象的创建而改变。
  • 初始值是 nullptr,表示还没有创建实例。
2. 私有构造函数
cpp 复制代码
TaskManager() {}
  • 构造函数是私有的,意味着外部代码不能直接调用 TaskManager 的构造函数来创建实例。这样做是为了确保 TaskManager 类不能直接创建多个实例,只能通过 getInstance() 来获取实例。
3. getInstance() 静态方法
cpp 复制代码
static TaskManager* getInstance() {
    if (instance == nullptr) {
        instance = new TaskManager();
    }
    return instance;
}
  • getInstance() 是一个静态方法,它提供了访问单例对象的全局入口。
  • 懒汉式(Lazy initialization) :在第一次调用 getInstance() 方法时,检查 instance 是否为 nullptr。如果是 nullptr,表示还没有创建实例,这时就创建一个新的 TaskManager 实例,并将其赋值给 instance
  • 如果 instance 已经被创建过了,直接返回该实例。这样就保证了每次调用 getInstance() 都是返回同一个实例。
4. TaskManager::instance = nullptr;
cpp 复制代码
TaskManager* TaskManager::instance = nullptr;
  • 这行代码在类外部初始化静态成员变量 instance。它设置初始值为 nullptr,表示没有实例化任何 TaskManager 对象。
  • 这是必须的,因为静态成员变量在声明时不能初始化,必须在类外部进行初始化。

如何保证单例的

  • 私有构造函数 :通过将构造函数设为私有,阻止了外部代码直接创建 TaskManager 的实例。
  • 静态成员变量instance 静态成员变量保证了 TaskManager 类只有一个实例。在 getInstance() 方法中,如果 instance 为空,则创建实例并赋值给 instance。如果已经有了实例,直接返回这个实例。
  • 全局访问入口 :通过 getInstance() 提供一个唯一的入口来访问单例对象,不需要手动创建新的实例。

示例使用

你可以通过 TaskManager::getInstance() 来访问唯一的 TaskManager 实例。即使在程序中多次调用 getInstance(),也只会返回同一个 TaskManager 实例。

cpp 复制代码
int main() {
    // 获取唯一的 TaskManager 实例
    TaskManager* manager1 = TaskManager::getInstance();
    
    // 获取相同的实例
    TaskManager* manager2 = TaskManager::getInstance();
    
    // manager1 和 manager2 指向同一个实例
    if (manager1 == manager2) {
        qDebug() << "Both are the same instance!";
    }
    
    return 0;
}

总结

  1. 私有构造函数 :禁止外部直接创建 TaskManager 的实例。
  2. 静态成员变量instance 保证了类中只有一个实例。
  3. getInstance() 方法:通过懒加载(延迟创建),第一次调用时创建唯一实例,后续的调用返回同一个实例。

这样就保证了 TaskManager 在整个程序运行过程中只有一个实例存在,所有需要访问 TaskManager 的地方都可以通过 getInstance() 获取到这个唯一实例。

相关推荐
cos1 小时前
Fork 主题如何更新?基于 Ink 构建主题更新 CLI 工具
前端·javascript·git
odoo中国1 小时前
Odoo 19 模块结构概述
开发语言·python·module·odoo·核心组件·py文件按
代码N年归来仍是新手村成员2 小时前
【Java转Go】即时通信系统代码分析(一)基础Server 构建
java·开发语言·golang
Z1Jxxx2 小时前
01序列01序列
开发语言·c++·算法
摸鱼的春哥2 小时前
AI编排实战:用 n8n + DeepSeek + Groq 打造全自动视频洗稿流水线
前端·javascript·后端
沐知全栈开发2 小时前
C语言中的强制类型转换
开发语言
关于不上作者榜就原神启动那件事2 小时前
Java中大量数据Excel导入导出的实现方案
java·开发语言·excel
坚定学代码3 小时前
基于观察者模式的ISO C++信号槽实现
开发语言·c++·观察者模式·ai
Wang's Blog3 小时前
Nodejs-HardCore: Buffer操作、Base64编码与zlib压缩实战
开发语言·nodejs
Coder_Boy_3 小时前
基于SpringAI的在线考试系统设计总案-知识点管理模块详细设计
android·java·javascript