单例模式(Singleton Pattern)

发布于:2025-03-27 ⋅ 阅读:(27) ⋅ 点赞:(0)

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

示例:
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;

或者

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;
};
#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. 静态成员变量
static TaskManager* instance = nullptr;
  • instance 是一个静态成员变量,它保存了 TaskManager 类的唯一实例。
  • 静态变量意味着它在所有的类实例中是共享的,因此它不会随对象的创建而改变。
  • 初始值是 nullptr,表示还没有创建实例。
2. 私有构造函数
TaskManager() {}
  • 构造函数是私有的,意味着外部代码不能直接调用 TaskManager 的构造函数来创建实例。这样做是为了确保 TaskManager 类不能直接创建多个实例,只能通过 getInstance() 来获取实例。
3. getInstance() 静态方法
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;
TaskManager* TaskManager::instance = nullptr;
  • 这行代码在类外部初始化静态成员变量 instance。它设置初始值为 nullptr,表示没有实例化任何 TaskManager 对象。
  • 这是必须的,因为静态成员变量在声明时不能初始化,必须在类外部进行初始化。

如何保证单例的

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

示例使用

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

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() 获取到这个唯一实例。