使用qt自带的宏编写一个饿汉式的单例方法
1.创建一个类,继承Object
2.在.h文件中定义一个instance方法,为了方便还可以取个别名方便使用
3.在.h文件中实现instance,并且引入宏Q_GLOBAL_STATIC(类名,实例名)
.h
#ifndef MANPLUGIN_H
#define MANPLUGIN_H
#include <QObject>
#define MP ManPlugin::instance()
class ManPlugin : public QObject
{
Q_OBJECT
public:
explicit ManPlugin(QObject *parent = nullptr);
static ManPlugin* instance();
signals:
};
#endif // MANPLUGIN_H
.cpp
#ifndef MANPLUGIN_H
#define MANPLUGIN_H
#include <QObject>
#define MP ManPlugin::instance()
class ManPlugin : public QObject
{
Q_OBJECT
public:
explicit ManPlugin(QObject *parent = nullptr);
static ManPlugin* instance();
signals:
};
#endif // MANPLUGIN_H
用c++实现的懒汉式
用一个全局信号的单例类举例
.h
#ifndef GLOBAL_H
#define GLOBAL_H
#include <QObject>
//全局信号转发单例类
class GlobalObj : public QObject
{
Q_OBJECT
public:
//获取单实例
static GlobalObj* getInstance();
//释放单实例
static void deleteInstance();
signals:
void sig_xixi();
void sig_buxixi();
private:
//构造、析构、拷贝构造、赋值构造私有
GlobalObj(){}
~GlobalObj(){}
GlobalObj(const GlobalObj &){}
const GlobalObj &operator=(const GlobalObj &){}
private:
//单实例对象指针
static GlobalObj *obj;
};
//全局参数类
class GlobalData
{
public:
static QString version;
};
#endif
.cpp
#include "global.h"
//全局信号转发单例类
GlobalObj* GlobalObj::obj = new GlobalObj();
GlobalObj *GlobalObj::getInstance()
{
return obj;
}
void GlobalObj::deleteInstance()
{
if(obj)
{
delete obj;
obj = nullptr;
}
}
//全局参数类
QString GlobalData::version = "1.0";
推荐使用官方宏定义方法的饿汉式,更安全不容易出错
另外说一下饿汉式的优缺点
优点:
- 实现简单:代码实现相对简单,易于理解和维护。
- 线程安全:由于实例是在类加载时创建的,因此不存在多线程环境下的同步问题。
- 资源消耗明确:实例创建的时间和空间消耗是可预测的,便于资源管理。
缺点:
- 可能的资源浪费:如果单例对象在整个程序生命周期中从未被使用,那么它的创建就是一种资源浪费。
- 增加启动时间:实例在程序启动时就创建,可能会增加程序的启动时间。