【设计模式】单例模式

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

特点:
优点:

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

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

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

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

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

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

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

适用场景:

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

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

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

示例:

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

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

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

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

相关推荐
咖啡八杯9 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
唐青枫18 小时前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6251 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902111 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠2 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
槑有老呆2 天前
别再手搓 Prompt 了,那个叫"手动挡循环"
设计模式
用户6919026813393 天前
Vibe Coding 开发项目的基本范式
人工智能·设计模式·代码规范
怕浪猫4 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
唐青枫4 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech4 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf