C++设计模式——单例模式(Qt单例写日志模块)
作用:保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例。
应用:常用于管理资源,如日志、线程池
实现要点:
在类中,要构造一个实例,就必须调用类的构造函数,并且为了保证全局只有一个实例,
需防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为private,
同时阻止拷贝创建对象时赋值时拷贝对象,因此也将它们声明并权限标记为private;
另外,需要提供一个全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。
首先,构造函数声明成private的目的是只允许内部调用,getInstance()中的静态局部变量创建时调用,但不允许外部调用构造创建第二个实例;
然后,拷贝构造和拷贝赋值符是声明成了private而不给出定义,其目的是阻止拷贝,如果企图通过拷贝构造来创建第二个实例,编译器会报错。
阻止拷贝的另一种写法是声明后接一个"=delete",也能起到相同的作用(C++11)。
class ZLSingletonLog : public QObject
{
Q_OBJECT
private:
ZLSingletonLog() { } //防止外部调用构造创建对象
~ZLSingletonLog(){ } //析构函数
ZLSingletonLog(const ZLSingletonLog &); //阻止拷贝创建对象
ZLSingletonLog& operator = (const ZLSingletonLog &); //阻止赋值对象
public:
static ZLSingletonLog *getInstance();
//打开日志并创建日志文件夹 默认为程序启动路径
void openLogFile(const QString &fileName, const QString &filePath = QCoreApplication::applicationDirPath());
//清理日志文件下日志数量 默认保留90天日志
void clearLogFile(const QString &filePath, const int &saveNum = 90);
//写消息到日志,新的一天会重新写一个log文件
void sysLog(const QString &info);
void closeLog();
};
ZLSingletonLog *ZLSingletonLog::getInstance()
{
static ZLSingletonLog *plog = nullptr; //一个静态变量,只有第一次为空时,才会new
if (plog == nullptr) {
static QMutex mutex; //这里再加一个锁(不加也没事)
QMutexLocker locker(&mutex);
plog = new ZLSingletonLog();
}
return plog;
}
最后,完成源码下载地址: