设计模式详解:单例(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 类的一个实例方法,可以通过全局访问点调用。
特点与考虑
单例模式提供了对唯一实例的严格控制,但也有一些潜在的问题需要考虑:
- 单例可能成为一个全局变量,使得代码之间的耦合度增加。
- 在多线程环境下,确保线程安全可能导致性能下降。
- 单例的生命周期通常贯穿整个程序,可能导致资源回收和管理上的复杂性。
这种模式在需要控制资源访问或配置全局状态的场景中非常有用,但应谨慎使用,以避免过度依赖全局状态。
热门推荐
(中医杂谈)诠解古方驻景丸
苏锡常城际铁路太仓先导段建设有了最新进展
如何制定一个均衡且多样化的饮食计划?
悦字五行属什么 悦字所属五行是什么
研究生时间管理大师:提升效率与学业压力两不误的秘诀
车牌号估价全攻略:稀缺性、地域性与文化价值的综合考量
学术会议综述如何写:从选题到提交的完整指南
查询手机生产日期的12种方法
胖男人“生育力”更差,下一代也会受影响
高压隔离开关基础知识
张红甫教你做肉沫蒸滑蛋家常美味不可错过
《权力的游戏》中 10 个主要角色名字的解释
介入医学影像技术在血管疾病治疗中的应用
如何通过音质和频率区分高低音?这些区分方法对音响体验有何影响?
吉林省已建成社区老年食堂1757个
《年轻的女教师3》:一位女教师的职场挑战与情感抉择
资料分析干货:混合增长率题型解题攻略
天潢贵胄命符是什么
玻尿酸能打出鼻尖吗?能够改善!具体看玻尿酸分子大小及医生审美和手法
一文总结:皮肤科常用的10个小药膏
多家农商银行调整聚合收款手续费:从无差别补贴到差异化收费
什么木材最耐用
一文看完,B2B企业海外社媒内容营销攻略
股票开盘和收盘时间如何查询?
猫咪换毛期的完美应对:15个实用护理方法
《生活中的情绪心理学》:活出心花怒放的人生
什么样的海报设计才更加吸引人?有哪些技巧?
重播次数最多的10部电视剧,个个都是经典,为何如此受欢迎
智能马桶盖怎么调节烘干温度?这些技巧来帮你!
体育用品外贸,开拓全球运动市场的无限潜力