目录
一、前言
单例模式是用来保证系统中只有一个实例,并提供一个访问它的全局访问点。
本节提供一个C++函数模板实现的单例模式,可直接套用。
二、源码简析
①单例函数模板
TSingleMode.h
#ifndef __TSINGLEMODE_H__
#define __TSINGLEMODE_H__
#include <QMutex>
template<typename T>
class TSingleMode
{
protected:
TSingleMode(){}
virtual ~TSingleMode(){}
public:
static T * getInstance()
{
if(m_instance == NULL)
{
m_mutex.lock();
if (m_instance == NULL)
{
m_instance = new T;
}
m_mutex.unlock();
}
return m_instance;
}
//摧毁单例
static void deleteInstance()
{
if(m_instance != NULL)
{
delete m_instance;
m_instance = NULL;
}
}
private:
static T * m_instance;
static QMutex m_mutex; //加入互斥锁,保证线程安全(如果存在多线程)
};
//静态成员变量初始化
template<typename T>
T* TSingleMode<T>::m_instance = NULL;
template<typename T>
QMutex TSingleMode<T>::m_mutex;
#endif
②使用方法
有两种方法,一种是直接调用模板;
另一种是继承模板单例化,例如有一个CSingleMode的类:
CSingleMode.h
#ifndef CSINGLEMODE_H
#define CSINGLEMODE_H
#include "TSingleMode.h"
//第二种方法,继承
class CSingleMode : public TSingleMode<CSingleMode>
{
friend class TSingleMode<CSingleMode>;
public:
CSingleMode();
~CSingleMode();
QString setStr();
private:
int m_load;
};
// 第一种方法,直接调用,上面就不需要继承TSingleMode模板了
// #define g_SingleMode (*TSingleMode<CSingleMode>::getInstance())
#endif // CSINGLEMODE_H
CSingleMode.cpp
#include "CSingleMode.h"
#include <QString>
CSingleMode::CSingleMode()
{
}
CSingleMode::~CSingleMode()
{
}
QString CSingleMode::setStr()
{
return QString("TextLabel_change");
}
那么这个CSingleMode.就是一个单例,可以直接使用,使用方法:
//第一种直接调用模板的方法
g_SingleMode.setStr();
//第二种继承的方法
CSingleMode::getInstance()->setStr();
三、Deomo/源码
链接:https://pan.baidu.com/s/1KcnHgzjCTbdWITD5jnt-LA
提取码:bjoy