设计模式详解:单例(Singleton)C++实现
创作时间:
作者:
@小白创作中心
设计模式详解:单例(Singleton)C++实现
引用
CSDN
1.
https://blog.csdn.net/qq_39071254/article/details/138992224
单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制资源访问或配置全局状态的场景中非常有用。本文将详细介绍单例模式的概念、实现方法以及在C++中的具体应用。
概念
单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式确保全局有一个单一的实例,并且这个实例可以在整个程序中方便地访问。
意图
- 确保一个类仅有一个实例,并提供一个全局访问点。
- 控制资源的访问,如数据库或文件的连接。
适用性
- 当类只能有一个实例而客户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需修改代码就能使用一个扩展的实例时。
结构
单例模式通常只涉及一个角色:
- Singleton:负责创建自己的唯一实例,并提供一个访问该实例的全局访问点。
实现代码示例
以下是使用 C++ 实现单例模式的一个示例,它包含线程安全的懒加载(延迟实例化)机制:
#include <iostream>
#include <mutex>
// Singleton
class Singleton {
private:
static Singleton *instance;
static std::mutex mutex;
protected:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton &) = delete;
Singleton &operator=(const Singleton &) = delete;
public:
static Singleton *getInstance() {
std::lock_guard<std::mutex> lock(mutex);
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
void doSomething() {
std::cout << "Doing something..." << std::endl;
}
};
// 必须在类外定义静态变量
Singleton *Singleton::instance = nullptr;
std::mutex Singleton::mutex;
// Client code
int main() {
Singleton *singleton = Singleton::getInstance();
singleton->doSomething();
return 0;
}
输出:
Doing something...
在这个示例中,Singleton 类包含一个静态私有成员 instance,它持有类的唯一实例。getInstance() 方法提供了一个全局访问点,并使用互斥锁确保多线程环境下的线程安全。doSomething() 方法是 Singleton 类的一个实例方法,可以通过全局访问点调用。
特点与考虑
单例模式提供了对唯一实例的严格控制,但也有一些潜在的问题需要考虑:
- 单例可能成为一个全局变量,使得代码之间的耦合度增加。
- 在多线程环境下,确保线程安全可能导致性能下降。
- 单例的生命周期通常贯穿整个程序,可能导致资源回收和管理上的复杂性。
这种模式在需要控制资源访问或配置全局状态的场景中非常有用,但应谨慎使用,以避免过度依赖全局状态。
热门推荐
血氧仪的原理与应用浅析
分时引用的操作方法是什么?这种操作方法有哪些应用场景?
CNC对刀仪怎么对刀:实现刀具参数精确测量的核心步骤
武夷岩茶百科:品种、茶类与品鉴秘籍!
西游记笔绘西行九头鸟:一场文化与科技的交汇之旅
1克价值62.5万亿美元,反物质为什么这么贵,为什么称为终极能源
有亲戚的团队如何管理
粉碗和粉碗之间的差距有多大?咖啡粉碗该装多少粉?51mm和58mm的粉碗哪个好?
结膜炎的日常护理:从眼部卫生到药物治疗
防止儿童坠落的9个防护措施
不时不食!除了这“十款”,中山还有这些美味→
2024年中国电动叉车行业发展现状和趋势分析 电动叉车产销量不断提升【组图】
制作成功视频的前期制作终极指南
氨市场规模、增长、趋势、应用、分析和预测 2033
北京墓地排名:文化自信的体现
储能锂电池在新能源重卡中的关键作用及挑战
探索 C 语言精髓:内存管理(学习笔记)
解放战争时期四大野战军兵力对比:谁的实力最强?
青树坪战斗:四野南下进程中的一次重要战役
易经卜卦:真能预知未来?
NBA常规赛收官:雷霆掘金同分领跑,约基奇锁定MVP
烟草:产业、健康、社会与未来的博弈
学校安全科研课题如何提升校园安全管理水平
失眠可不止一种,这三个妙招能让你不论因为什么,都安然入睡
法医心理评估:临床心理学家如何协助法庭作出公正判决
比特币交易必备:七大技术指标详解与实战应用
漫步金粉地,梦回六朝:南京六朝古都的前世今生
房产税如何影响家庭生活
国产开源大模型生态发展现状分析
突破性研究:靶向DKK1可增强紫杉醇抗肿瘤活性并减轻化疗副作用