单例模式(Singleton Pattern)
概念:
· 确保一个类只有一个实例,并提供一个全局访问点来获取该实例;
· 限制类实例的数量为 1 ;
· 提供一个静态方法来获取唯一实例;
UML结构:
Client | Singleton | ----------------- | -instance | | +GetInstance()| -----------------代码示例:
cs/// <summary> /// 单例模式(懒汉式) /// </summary> public class SingletonMono1 { private static readonly object instanceLocked = new(); private static SingletonMono1 _instance; public static SingletonMono1 Instance { get { if (_instance == null) { lock (instanceLocked) { if (_instance == null) { _instance = new(); } } } return _instance; } } // 私有化构造函数(默认为public) private SingletonMono1() { } } /// <summary> /// 单例模式(饿汉式) /// </summary> public class SingletonMono2 { private static SingletonMono2 _instance = new SingletonMono2(); public static SingletonMono2 Instance => _instance; // 私有化构造函数(默认为public) private SingletonMono2() { } }特点:
优点:· 唯一实例 :全局只有一个对象,避免资源浪费;
· 全局访问点 :提供统一的入口访问实例;
· 懒加载 :可以在第一次使用时再创建实例,节省性能;
缺点:· 难以扩展 :单例类一般不能被继承;
· 隐藏依赖 :全局使用单例可能造成代码耦合度高;
· 多线程问题 :如果实现不当,可能在多线程环境下出现多个实例;
· 不利于测试 :因为是全局对象,可能导致单元测试难以编写(可能很多因素在同时改变着这个单例);
适用场景:
· 全局唯一资源 :某个类在系统中只需要一个实例;
· 频繁访问共享资源 :需要统一控制访问,避免重复创建;
· 需要全局配置管理 :比如配置文件、日志系统;
示例:
· 日志管理器 :整个系统中只需要一个日志对象,负责统一记录日志,避免文件句柄冲突;
· 配置类 :应用启动时读取一次配置文件,后续都用单例对象来访问配置数据;
· 线程池 :系统中只需要一个线程池来管理线程;
· 数据库连接池:避免每次都创建和销毁数据库连接,统一由单例管理连接池;
【设计模式】单例模式
大飞pkz2025-09-24 15:33
相关推荐
熊猫钓鱼>_>8 分钟前
三方库 NDK 原生模块跨平台适配与调试【鸿蒙心迹】步步为营DotNet9 分钟前
.NET 可观测性选型:Metrics、ActivitySource、EventSource 到底该用哪个HANDY0920014 分钟前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架是2的10次方啊1 小时前
设计模式与生活⑪:地铁里被打扰,别总靠自己硬扛1024奇点9 小时前
【仓颉语言入门 · 第二篇 第 22 课】Warren2Lynch10 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南Knight_AL11 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查FRing0311 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)吃一碗粉只付一碗钱12 小时前
16-SqlSugar多库ConfigId与按实体选连接by2099912 小时前
C++ 智能指针的所有权与使用