这篇文章总结的挺好:单例模式总结
以下代码摘自于此篇文章:
饿汉模式
// 饿汉式单例的实现
#ifndef C_SINGLETON_H
#define C_SINGLETON_H
#include<iostream>
using namespace std;
class CSingleton
{
private:
CSingleton(){ cout << "单例对象创建!" << endl; };
CSingleton(const CSingleton &);
CSingleton& operator=(const CSingleton &);
~CSingleton(){ cout << "单例对象销毁!" << endl; };
static CSingleton myInstance; // 单例对象在这里!
public:
static CSingleton* getInstance()
{
return &myInstance;
}
};
#endif
//主文件,用于测试用例的生成
#include<iostream>
#include"CSingleton.h"
using namespace std;
CSingleton CSingleton::myInstance;
int main()
{
CSingleton *ct1 = CSingleton::getInstance();
CSingleton *ct2 = CSingleton::getInstance();
CSingleton *ct3 = CSingleton::getInstance();
return 0;
}
懒汉模式
懒汉模式,需要考虑多线程问题,源码待添加
单例模式的模板方法
#pragma once
template<typename T>
class Singleton
{
protected:
Singleton() = default;
public:
Singleton(Singleton const&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(Singleton const&) = delete;
Singleton& operator=(Singleton&&) = delete;
static T& getInstance()
{
static T inst;
return inst;
}
};
模板单例使用案例
#ifndef TOASTDIALOG_H
#define TOASTDIALOG_H
#include <QDialog>
#include <QTimer>
#include <QFont>
#include "utils/Singleton.h"
namespace Ui {
class ToastDialog;
}
class ToastDialog : public QDialog, public Singleton<ToastDialog>
{
Q_OBJECT
public:
explicit ToastDialog(QWidget *parent = nullptr);
~ToastDialog();
void setText(const QString& text);
void setIconPath(const QString& path);
void setIconVisible(bool visible);
void startTimer(int interval = 2000);
private:
Ui::ToastDialog *ui;
QTimer *m_pTimer;
QFont m_font;
};
#endif // TOASTDIALOG_H