背景
- 确保类对象只被初始化一次,类成员具有全局唯一性,如全局变量共享,一些统一的工具函数共享。
- 通过静态公有方法获取对象实例,能够提供一个访问类对象的全局指针
- 单例模式在我们开发中经常会用到的,单例模式有两种,分为懒汉模式和饿汉模式,这两种各有各的用法。
一、单例设计模式
懒汉式在类加载时不初始化,延迟加载。(配置文件)
懒汉式需要加synchronized,否则不安全。这边使用原子指针的方式,外加双重检测,加锁等方式,实现可以跨线程的安全的操作。
singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H
#include <QMap>
#include <QObject>
#include <QMutex>
#include <QMutexLocker>
class QSingleton : public QObject
{
Q_OBJECT
public:
explicit QSingleton(QObject *parent = nullptr);
static QSingleton *getInstance(void);
public:
bool islock;
int count;
QMap<QString, float> SimData_Map;
private:
static QAtomicPointer<QSingleton> _instance;
static QMutex _mutex;
signals:
public slots:
};
#endif // SINGLETON
singleton.cpp
#include "singleton.h"
QAtomicPointer<QSingleton> QSingleton::_instance = nullptr;
QMutex QSingleton::_mutex;
/*******************************************************************
** 函数名: QSingleton
** 函数描述: 构造函数
** 参数:
** 返回:
********************************************************************/
QSingleton::QSingleton(QObject *parent) : QObject(parent)
{
}
/*******************************************************************
** 函数名: getInstance
** 函数描述: 获取单例指针//使用双重检测。
** 参数:
** 返回:
********************************************************************/
QSingleton* QSingleton::getInstance(void)
{
if(!_instance){//第一次检测
QMutexLocker lock(&_mutex);
if(!_instance){
QSingleton *pInstance = new QSingleton();
// _instance.testAndSetOrdered(0, new QSingleton);//第二次检测。
_instance = pInstance;
}
}
return _instance;
}
调用时使用可使用
QSingleton * m_sigleton = m_sigleton->getInstance();
也可以使用
QSingleton::getInstance()