单例模式是软件设计模式中最简单也是最常用的一种创建型设计模式 。它的核心目标是确保一个类在整个应用程序生命周期中只有一个实例,并提供一个全局访问点。
**笔者白话版理解:**你创建了一个类,如果你希望这个类对象在工程中应用时只创建一次,不能多次创建,比如:TCP通信时,通信模式为一对多,只能有一个服务器,而客户端可以有多个,那么你在创建服务器类时,就可以使用单例模式,这样就可以保证工程中只会有一个服务器。
核心概念
三大要点
- 私有化构造函数 - 防止外部直接创建实例
- 私有化拷贝构造函数和赋值操作符 - 防止实例被复制
- 提供全局访问的静态方法 - 获取唯一的实例
主要特点
-
唯一实例:保证一个类只有一个实例存在
-
全局访问:提供统一的访问接口
-
延迟初始化:实例在第一次使用时才被创建
-
线程安全:在多线程环境下也能保证唯一性
话不多说,直接上例子
基于Qt的应用:
cpp
// LaserStabilizeWin.h文件
class LaserStabilizeWin : public QWidget
{
Q_OBJECT
public:
static LaserStabilizeWin* instance();
static void disinstance();
private:
explicit LaserStabilizeWin(QWidget *parent = nullptr); //私有化构造函数
~LaserStabilizeWin();
};
cpp
// LaserStabilizeWin.cpp
#include "LaserStabilizeWin.h"
LaserStabilizeWin* LaserStabilizeWin::m_pInstance = NULL; //静态成员定义
LaserStabilizeWin *LaserStabilizeWin::instance()
{
if (m_pInstance == NULL)
{
m_pInstance = new LaserStabilizeWin(NULL);
}
return m_pInstance;
}
void LaserStabilizeWin::disinstance()
{
delete m_pInstance;
m_pInstance = nullptr;
}
LaserStabilizeWin::LaserStabilizeWin(QWidget *parent) : QWidget(parent)
{
qDebug()<<"构造函数";
}
LaserStabilizeWin::~LaserStabilizeWin()
{
qDebug()<<"析构函数";
}
在纯C++开发中的应用,和上面的区别不大:
cpp
class BestSingleton {
public:
static BestSingleton& getInstance() {
static BestSingleton instance;
return instance;
}
// 业务方法...
private:
//私有化构造函数和析构函数
BestSingleton() = default;
~BestSingleton() = default;
BestSingleton(const BestSingleton&) = delete;
BestSingleton& operator=(const BestSingleton&) = delete;
};
使用场景
-
资源共享:如数据库连接池、线程池
-
配置管理:全局配置信息
-
日志记录:统一的日志系统
-
缓存系统:全局缓存管理
-
设备控制:如打印机、硬件设备控制