【设计模式】单例模式

单例模式(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() { }
}

特点:
优点:

· 唯一实例 :全局只有一个对象,避免资源浪费;

· 全局访问点 :提供统一的入口访问实例;

· 懒加载 :可以在第一次使用时再创建实例,节省性能;
缺点:

· 难以扩展 :单例类一般不能被继承;

· 隐藏依赖 :全局使用单例可能造成代码耦合度高;

· 多线程问题 :如果实现不当,可能在多线程环境下出现多个实例;

· 不利于测试 :因为是全局对象,可能导致单元测试难以编写(可能很多因素在同时改变着这个单例);

适用场景:

· 全局唯一资源 :某个类在系统中只需要一个实例;

· 频繁访问共享资源 :需要统一控制访问,避免重复创建;

· 需要全局配置管理 :比如配置文件、日志系统;

示例:

· 日志管理器 :整个系统中只需要一个日志对象,负责统一记录日志,避免文件句柄冲突;

· 配置类 :应用启动时读取一次配置文件,后续都用单例对象来访问配置数据;

· 线程池 :系统中只需要一个线程池来管理线程;

· 数据库连接池:避免每次都创建和销毁数据库连接,统一由单例管理连接池;

相关推荐
codeejun15 小时前
每日一 Go-72、分布式事务 & 一致性:本地消息表、事务消息、SAGA、TCC怎么选?
开发语言·分布式·golang
sycmancia15 小时前
Qt——程序中的配置文件
开发语言·qt
赶在日落之前15 小时前
使用conda-pack打包完整 Python 环境 + 依赖包,传到无网机器解压即用
开发语言·人工智能·python
雨落在了我的手上15 小时前
Java数据结构(一):初识集合框架
java·开发语言
程序大视界15 小时前
【C++ 从基础到项目实战】C++(三):函数进阶——重载、回调、递归与默认参数
开发语言·c++·cpp
爱喝水的鱼丶15 小时前
SAP-ABAP:SAP 简单报表输出开发系列(共6篇)第二篇:SAP 报表数据筛选优化:选择屏幕自定义与查询效率提升
开发语言·数据库·学习·性能优化·sap·abap
HappyAcmen15 小时前
8.角色 Prompt 模板
开发语言·python·prompt
咖啡八杯15 小时前
GoF设计模式——装饰模式
java·算法·设计模式·装饰器模式
oort12315 小时前
VLStream 全开源决策式 AI 视频平台 技术视角完整说明
大数据·开发语言·人工智能·经验分享·python·开源·音视频
雪豹阿伟15 小时前
14.C# —— 静态成员、只读常量、继承、访问修饰符、多态、抽象类
c#·上位机