基本概念
单例模式是一种创建型设计模式,是最常见、最简单的设计模式之一。
单例模式保证一个类在程序中只有一个实例,并提供一个全局访问点。
使用场景
- 想控制实例数目,节省系统资源的时候。
- 在整个程序中只需要一个实例的情况,比如日志记录器、数据库连接池、线程池等。
实现
饿汉模式
饿汉模式中,单例实例在类加载时就被创建,无论是否被调用,它都会被实例化。
饿汉模式易于实现和理解,并且一定是线程安全的,缺点是可能会浪费内存资源。
// 饿汉模式
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
单一实例的指针。