5.单例模式

  1. 构造函数和静态成员私有

  2. 获取单例实例的静态方法公有

  3. 在实现文件中首先需对静态成员变量初始化为nullptr

  4. 随后main可通过静态方法获得单例实例

    1. 全局唯一实例: 单例模式的核心是确保一个类只有一个实例,并提供一个全局访问点。使用静态成员变量可以确保在整个程序生命周期内,只有一个实例存在。

    2. 静态成员变量的生命周期: 静态成员变量属于类而不是实例,它的生命周期与程序运行的整个周期相同。因此,一旦被初始化,就能一直存在,不会因为对象的创建和销毁而改变。

    3. 静态实例方法的访问点: 静态方法属于类而不是实例,可以在没有创建类实例的情况下调用。这是确保全局访问点的关键。静态方法通常用于创建或获取类的唯一实例。

#include <iostream>

class Singleton {
public:
    // 获取单例实例的静态方法
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }

    // 示例成员函数
    void showMessage() {
        std::cout << "Hello from Singleton!" << std::endl;
    }

private:
    // 私有构造函数,防止直接实例化
    Singleton() {}

    // 静态成员变量,保存唯一实例
    static Singleton* instance;
};

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

int main() {
    // 获取单例实例
    Singleton* singleton1 = Singleton::getInstance();
    singleton1->showMessage();

    // 尝试再次获取实例,应该返回相同的实例
    Singleton* singleton2 = Singleton::getInstance();
    singleton2->showMessage();

    // 检查两个指针是否相等,说明是同一个实例
    if (singleton1 == singleton2) {
        std::cout << "Same instance!" << std::endl;
    } else {
        std::cout << "Different instances!" << std::endl;
    }

    return 0;
}

 

Singleton 类有一个私有的静态成员变量 instance,用于保存唯一的实例。通过静态方法 getInstance 获取实例,如果实例不存在,则创建一个新的实例;如果实例已经存在,则直接返回该实例

上述的简单实现在多线程环境下可能存在问题,因为多个线程同时调用 getInstance 可能导致创建多个实例。在实际应用中,可能需要使用线程安全的实现方式,例如使用互斥锁或者使用更为复杂的实现方式,如双重检查锁定

双重检查锁定(Double-Checked Locking)是一种用于在多线程环境下实现延迟初始化的设计模式。它的目标是在实现延迟初始化的同时,尽可能减小性能开销。

在单例模式中,延迟初始化是指在需要使用实例时才创建对象,而不是在程序启动时就创建。双重检查锁定是一种常见的实现方式,通常结合了懒汉式单例模式和锁定机制。

class Singleton {
public:
    // 获取单例实例的静态方法
    static Singleton* getInstance() {
        // 双重检查锁定
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mutex); // 加锁
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }

    // 示例成员函数
    void showMessage() {
        std::cout << "Hello from Singleton!" << std::endl;
    }

private:
    // 私有构造函数,防止直接实例化
    Singleton() {}
    // 静态成员变量,保存唯一实例
    static Singleton* instance;
    // 用于加锁的互斥量
    static std::mutex mutex;
};

 

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在PyQt5中实现单例模式可以通过以下步骤: 1. 导入必要的模块: ```python from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QCoreApplication from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QSystemTrayIcon ``` 2. 创建一个继承自QApplication的子类,并在该子类中实现单例模式: ```python class SingleApplication(QApplication): def __init__(self, argv, app_id): super().__init__(argv) self.setApplicationName(app_id) self.setQuitOnLastWindowClosed(False) self.tray_icon = QSystemTrayIcon(QIcon("icon.png"), self) self.tray_icon.show() self.tray_icon.setToolTip(app_id) self.tray_icon.activated.connect(self.handle_tray_icon_activated) self.instance = QSingleInstance(app_id) def handle_tray_icon_activated(self, reason): if reason == QSystemTrayIcon.Trigger: # 处理托盘图标被点击的事件 pass def is_running(self): return self.instance.is_running() def message_received(self, message): # 处理接收到的消息 pass ``` 3. 创建一个QSingleInstance类,用于检测是否已经有实例在运行: ```python from PyQt5.QtNetwork import QLocalServer, QLocalSocket class QSingleInstance: def __init__(self, app_id): self.app_id = app_id self.server = QLocalServer() self.server.newConnection.connect(self.handle_new_connection) self.server.listen(self.app_id) def is_running(self): socket = QLocalSocket() socket.connectToServer(self.app_id) if socket.waitForConnected(500): return True return False def handle_new_connection(self): socket = self.server.nextPendingConnection() if socket.waitForReadyRead(500): message = socket.readAll().data().decode() # 处理接收到的消息 pass socket.disconnectFromServer() ``` 4. 在主程序中使用单例模式: ```python if __name__ == "__main__": app_id = "MyApp" app = SingleApplication(sys.argv, app_id) if app.is_running(): # 如果已经有实例在运行,则发送消息给已经运行的实例 app.message_received("Hello from another instance!") sys.exit(0) else: # 如果没有实例在运行,则正常启动应用程序 window = MainWindow() window.show() sys.exit(app.exec_()) ``` 这样就可以在PyQt5中实现单例模式了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值