1. 单例模式
单例模式的要点有三个:
- 某个类只能有一个实例;
- 它必须自行创建这个实例;
- 它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:
- 单例模式的类只提供私有的构造函数,私有化拷贝构造函数和赋值操作符防止复制
- 类定义中含有一个该类的静态私有对象
- 该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
2. 单例需不需要释放
单例模式所提供的实例是new出来的,分配在堆中,不会自动释放,需要手动释放。
3. 单例类模板实现
#include <mutex>
#include <QDebug>
template <class T>
class Singleton
{
private:
static T* m_pInstance;
Singleton(const Singleton& other) {}
Singleton& operator=(const Singleton& other) {}
// 内嵌类用于自动垃圾回收
class Gc
{
public:
~Gc()
{
if (Singleton::m_pInstance) {
qDebug()<<"delete instance";
delete Singleton::m_pInstance;
Singleton::m_pInstance = NULL;
}
}
};
protected:
Singleton() {}
~Singleton() {}
public:
static T* getInstance()
{
static std::mutex lock;
static Gc gc; // 初始化gc,程序结束时会释放静态变量,调用~Gc(),从而释放掉实例m_pInstance
if (m_pInstance == NULL) {
std::lock_guard<std::mutex> locker(lock);
if (m_pInstance == NULL)
{
qDebug()<<"init instance";
m_pInstance = new T();
}
}
return m_pInstance;
}
};
template <class T>
T* Singleton<T>::m_pInstance = NULL;
4.使用方法,测试类
myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include "singleton.h"
class MyClass: public Singleton<MyClass>
{
private:
MyClass();
public:
~MyClass();
private:
friend class Singleton<MyClass>; // 声明友元类模板
};
#endif // MYCLASS_H
myclass.cpp
#include "myclass.h"
#include <QDebug>
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
qDebug()<<"delete myclass";
}
5. 测试
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyClass *mc = MyClass::getInstance();
MainWindow w;
w.show();
return a.exec();
}
输出:
init instance // 程序启动输出init
delete instance // 关闭window后,gc释放实例
delete myclass // gc中delete m_pInstance 会调用MyClass的析构函数。