基本思想
- 私有化類的構造函數谍倦,作用:不允許在棧上創(chuàng)建對象或使用new操作符創(chuàng)建對象捻激;
- 通過靜態(tài)公有方法戚长,如命名為:getInstance()獲取對象實例;
- 確保類對象只被初始化一次榆俺,類成員具有全局唯一性。
優(yōu)點和用途
- 常用于程序的全局配置坞淮;
- 常用于程序引擎類茴晋;
- 用于數據的存儲,保證數據的唯一性回窘;
- 單實例對象同其他類成員的耦合性低诺擅,在包含單實例頭文件的源代碼文件中,通過單實例類名和作用域符號即可調用靜態(tài)公有方法getInstance()來獲取單實例對象啡直,而不用把單實例對象設置為其他類的成員烁涌;調用單實例對象的公有靜態(tài)方法一般命名為getInstance(),該函數返回單實例對象指針酒觅。
示例代碼
engine.h
#ifndef ENGINE_H
#define ENGINE_H
#include <QObject>
class Engine : public QObject
{
Q_OBJECT
public:
//公有靜態(tài)函數
static Engine* getInstance();
void doSomething();
private:
//私有構造函數
explicit Engine(QObject *parent = 0);
private:
static Engine* m_engine;
Q_DISABLE_COPY(Engine)//聲明拷貝構造函數和賦值操作符運算為私有
};
#endif // ENGINE_H
engine.cpp
#include "engine.h"
#include <QDebug>
Engine* Engine::m_engine = NULL;//類外初始化靜態(tài)成員
static QMutex mutex;
Engine::Engine(QObject *parent): QObject(parent)
{
}
void Engine::doSomething()
{
qDebug()<<__LINE__<<__FUNCTION__;
}
Engine *Engine::getInstance()
{
if(m_engine == NULL)
{
QMutexLocker locker(&mutex);//確保線程安全
if(m_engine == NULL)
{
m_engine = new Engine();
}
}
return m_engine;
}
使用方法
在程序需要用到Engine對象實例的地方撮执,按如下方式調用單實例對象的方法即可。
Engine::getInstance()->doSomething();