设计模式-5.单例(Singleton)C++实现
创作时间:
作者:
@小白创作中心
设计模式-5.单例(Singleton)C++实现
引用
CSDN
1.
https://blog.csdn.net/qq_39071254/article/details/138992224
单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制资源访问或配置全局状态的场景中非常有用。本文将详细介绍单例模式的概念、实现方法以及使用时需要注意的问题。
5.设计模式名称:单例(Singleton)
概念
单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式确保全局有一个单一的实例,并且这个实例可以在整个程序中方便地访问。
意图
- 确保一个类仅有一个实例,并提供一个全局访问点。
- 控制资源的访问,如数据库或文件的连接。
适用性
- 当类只能有一个实例而客户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需修改代码就能使用一个扩展的实例时。
结构
单例模式通常只涉及一个角色:
- 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
类的一个实例方法,可以通过全局访问点调用。
特点与考虑
单例模式提供了对唯一实例的严格控制,但也有一些潜在的问题需要考虑:
- 单例可能成为一个全局变量,使得代码之间的耦合度增加。
- 在多线程环境下,确保线程安全可能导致性能下降。
- 单例的生命周期通常贯穿整个程序,可能导致资源回收和管理上的复杂性。
这种模式在需要控制资源访问或配置全局状态的场景中非常有用,但应谨慎使用,以避免过度依赖全局状态。
热门推荐
与"最强大脑"双向奔赴——"科学家带你游三山五园"第三季圆满收官
朱瑞为何被称为“我军炮兵之父”?他的这几个贡献永载史册!
成人学绘画应该怎么学,需要掌握哪些基础技巧
“八朝古都”开封:见证古城中轴线文化
格力空调如何拆装的详细步骤
甲旁亢患者的护理措施
怎么解析语文句子结构
学会6个谈判技巧,让老板、下属都听你的
各界人士山东邹城拜谒人文始祖伏羲女娲
医用冷敷贴能当面膜吗
2025体重管理年,跟着国家指南,用SAT-3D科学减重
呼叫中心耳机与蓝牙耳机的优缺点对比
智齿横着长了拔掉难度大吗?比较难拔!位置不正|靠近神经线建议选择医生多下功夫!
九江十大美食:从鄱湖胖鱼头到九江茶饼
五花肉焯水时,万万别直接下锅焯!多加1步,肉质鲜嫩无腥味
圣经中的十条诫命:道德的基石与人类的共同遗产
眼睛健康检查:近视风险评估
猪精准营养配方技术体系建立与应用
2025年婚戒选黄金还是铂金?全方位对比分析
维生素B12知多少?吃了有何好处?哪些人禁用?详细做出解答
怎样计算现货黄金的风险阈值?这个风险阈值如何影响投资策略?
空调能效比大揭秘:数字越大越省电?别被忽悠了!
水晶头网线正确接线方法:详解与实操指南
苏联最惨烈的战争:损失近千万军队,450多位将军丧命
《职场避坑指南》
快骑自行车对健康的好处
巴菲特:最靠谱的投资只有自己!
高血脂患者能吃油炸食物吗?专业解析与饮食建议
结直肠癌:筛查、风险与预防全指南
关于内存条的知识要点