基本思想
- 私有化類的構(gòu)造函數(shù),作用:不允許在棧上創(chuàng)建對(duì)象或使用new操作符創(chuàng)建對(duì)象;
- 通過(guò)靜態(tài)公有方法,如命名為:getInstance()獲取對(duì)象實(shí)例;
- 確保類對(duì)象只被初始化一次,類成員具有全局唯一性。
優(yōu)點(diǎn)和用途
- 常用于程序的全局配置;
- 常用于程序引擎類;
- 用于數(shù)據(jù)的存儲(chǔ),保證數(shù)據(jù)的唯一性;
- 單實(shí)例對(duì)象同其他類成員的耦合性低,在包含單實(shí)例頭文件的源代碼文件中,通過(guò)單實(shí)例類名和作用域符號(hào)即可調(diào)用靜態(tài)公有方法getInstance()來(lái)獲取單實(shí)例對(duì)象,而不用把單實(shí)例對(duì)象設(shè)置為其他類的成員;調(diào)用單實(shí)例對(duì)象的公有靜態(tài)方法一般命名為getInstance(),該函數(shù)返回單實(shí)例對(duì)象指針。
示例代碼
engine.h
#ifndef ENGINE_H
#define ENGINE_H
#include <QObject>
class Engine : public QObject
{
Q_OBJECT
public:
//公有靜態(tài)函數(shù)
static Engine* getInstance();
void doSomething();
private:
//私有構(gòu)造函數(shù)
explicit Engine(QObject *parent = 0);
private:
static Engine* m_engine;
Q_DISABLE_COPY(Engine)//聲明拷貝構(gòu)造函數(shù)和賦值操作符運(yùn)算為私有
};
#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對(duì)象實(shí)例的地方,按如下方式調(diào)用單實(shí)例對(duì)象的方法即可。
Engine::getInstance()->doSomething();