示例:
#ifndef TEST_H
#define TEST_H
class test
{
public:
static test * GetINSTANCE();
void print();
private:
test();
};
#endif // TEST_H
#include "test.h"
#include <QMutex>
#include <QDebug>
test::test()
{
}
test *test::GetINSTANCE()
{
static test * inst = nullptr;
static QMutex mutex;
mutex.lock();
if(!inst)
{
inst = new test;
}
mutex.unlock();
return inst;
}
void test::print()
{
static int m = 0;
m++;
qDebug()<<__FILE__<<"["<<__LINE__<<"]"<< m;
}
补充:
这样写也可以:
static T * GetINSTANCE() { static QScopedPointer<T> inst; static QMutex mutex; mutex.lock(); if(!inst) { inst.reset(new T()); } mutex.unlock(); return inst.data(); }
test::GetINSTANCE()->print();
test::GetINSTANCE()->print();
test::GetINSTANCE()->print();
..\try\test.cpp [ 26 ] 1
..\try\test.cpp [ 26 ] 2
..\try\test.cpp [ 26 ] 3
使用类模板进行简单的优化,使代码扩展性更好一些:
#ifndef TEST_H
#define TEST_H
#include <QMutex>
template<typename T>
class Singleton
{
public:
static T * GetINSTANCE()
{
static T * inst = nullptr;
static QMutex mutex;
mutex.lock();
if(!inst)
{
inst = new T();
}
mutex.unlock();
return inst;
}
protected:
Singleton() = default;
};
class test:public Singleton<test>
{
friend class Singleton<test>;
public:
void print();
private:
test() = default;
};
#endif // TEST_H
#include "test.h"
#include <QDebug>
void test::print()
{
static int m = 0;
m++;
qDebug()<<__FILE__<<"["<<__LINE__<<"]"<< m;
}
test::GetINSTANCE()->print();
test::GetINSTANCE()->print();
test::GetINSTANCE()->print();
..\try\test.cpp [ 11 ] 1
..\try\test.cpp [ 11 ] 2
..\try\test.cpp [ 11 ] 3