目錄
一、前言
單例模式是用來保證系統中只有一個實例,並提供一個訪問它的全局訪問點。
本節提供一個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;
};
#endif // CSINGLEMODE_H
CSingleMode.cpp
#include "CSingleMode.h"
#include <QString>
CSingleMode::CSingleMode()
{
}
CSingleMode::~CSingleMode()
{
}
QString CSingleMode::setStr()
{
return QString("TextLabel_change");
}
那麼這個CSingleMode.就是一個單例,可以直接使用,使用方法:
CSingleMode::getInstance()->setStr();
三、Deomo/源碼
鏈接:https://pan.baidu.com/s/1KcnHgzjCTbdWITD5jnt-LA
提取碼:bjoy