个人技术分享

基本概念

单例模式是一种创建型设计模式,是最常见、最简单的设计模式之一。

单例模式保证一个类在程序中只有一个实例,并提供一个全局访问点。

使用场景

  • 想控制实例数目,节省系统资源的时候。
  • 在整个程序中只需要一个实例的情况,比如日志记录器、数据库连接池、线程池等。

实现

饿汉模式

饿汉模式中,单例实例在类加载时就被创建,无论是否被调用,它都会被实例化。

饿汉模式易于实现和理解,并且一定是线程安全的,缺点是可能会浪费内存资源。

// 饿汉模式
template <typename T>
class Singleton
{
private:
    Singleton() = delete;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
 
public:
    static T* getInstance(){
        return m_Instance;
    }
 
private:
    static T* m_Instance;
};

template <typename T>
T* Singleton<T>::m_Instance = new T();

懒汉模式

懒汉模式中,单例实例在第一次被引用时才会被创建。如果该实例从未被使用,那么它就永远不会被实例化。

懒汉模式的优点是节省内存以及程序启动时间,缺点是实现相对复杂以及需要考虑线程安全。

#include <Qmutex>

// 懒汉模式:多线程安全
template <typename T>
class Singleton
{
public:
    static T* getInstance(){
        if (m_Instance == nullptr){
            m_mutex.lock();
            if (m_Instance == nullptr){
                m_Instance = new T();
            }
            m_mutex.unlock();
        }
        return m_Instance;
    }

private:
    Singleton() = delete;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    static T* m_Instance;
    static QMutex m_mutex;
};

template <typename T>
T* Singleton<T>::m_Instance = nullptr;

template <typename T>
QMutex Singleton<T>::m_mutex;

使用方法

class MyClass {
    friend class Singleton<MyClass>;
private:
    void doSomething();
};

int main() {
    Singleton<MyClass>::getInstance()->doSomething();
    return 0;
}

注意:如果没有在使用单例模式的类里面声明 Singleton 类声明为友元,将无法访问类的私有成员。

实现:QApplication 类和 qApp

QApplication 是 Qt 中的一个核心类,用于管理应用程序的整个生命周期。它提供了对事件循环、应用程序设置、资源管理等方面的支持。

由于 QApplication 对象进行了大量的初始化,因此必须在创建与用户界面相关的任何其他对象之前创建它。并且因为其管理整个应用程序的各种核心信息,所以其在整个对象只能有一个实例对象。

qApp 就 是一 个指向 QApplicat ion 单一实例的指针。