当前位置: 首页 > article >正文

23种设计模式之单例模式(Singleton Pattern)【设计模式】

文章目录

  • 一、简介
  • 二、关键点
  • 三、实现单例模式的步骤
  • 四、C#示例
    • 4.1 简单的单例模式
    • 4.2 线程安全的单例模式(双重检查锁定)
    • 4.3 静态初始化单例模式
  • 五、单例模式优缺点
    • 5.1 优点
    • 5.2 缺点
  • 六、适用场景
  • 七、示例的现实应用


在这里插入图片描述

一、简介

单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式主要用于控制资源的访问,确保某些类只有一个实例,并且这个实例能够被全局访问。

二、关键点

  • 唯一实例:确保一个类只有一个实例。
  • 全局访问点:提供一个全局访问点来访问该实例。

三、实现单例模式的步骤

  • 私有构造函数:防止类被实例化。
  • 私有静态变量:持有该类的唯一实例。
  • 公共静态方法:提供一个全局访问点来访问该实例。

四、C#示例

4.1 简单的单例模式

public class SimpleSingleton
{
    // 私有静态变量,持有唯一实例
    private static SimpleSingleton instance = null;

    // 私有构造函数,防止外部实例化
    private SimpleSingleton() { }

    // 公共静态方法,提供全局访问点
    public static SimpleSingleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new SimpleSingleton();
            }
            return instance;
        }
    }
}

4.2 线程安全的单例模式(双重检查锁定)

在多线程环境中,上面的实现可能会导致多个实例的创建。为了解决这个问题,我们可以使用双重检查锁定(Double-Check Locking)来实现线程安全的单例模式。

public class ThreadSafeSingleton
{
    // 私有静态变量,持有唯一实例,并使用 volatile 关键字确保多线程可见性
    private static volatile ThreadSafeSingleton instance = null;
    private static readonly object lockObject = new object();

    // 私有构造函数,防止外部实例化
    private ThreadSafeSingleton() { }

    // 公共静态方法,提供全局访问点
    public static ThreadSafeSingleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObject)
                {
                    if (instance == null)
                    {
                        instance = new ThreadSafeSingleton();
                    }
                }
            }
            return instance;
        }
    }
}

4.3 静态初始化单例模式

这种实现利用了 .NET 的静态构造函数,保证了线程安全性,并且代码更加简洁。

public class StaticInitializationSingleton
{
    // 静态变量,持有唯一实例
    private static readonly StaticInitializationSingleton instance = new StaticInitializationSingleton();

    // 私有构造函数,防止外部实例化
    private StaticInitializationSingleton() { }

    // 公共静态属性,提供全局访问点
    public static StaticInitializationSingleton Instance
    {
        get
        {
            return instance;
        }
    }
}

五、单例模式优缺点

5.1 优点

  • 唯一实例:确保系统中只有一个实例,节省系统资源。
  • 全局访问点:提供一个全局访问点,方便访问该实例。

5.2 缺点

  • 可能造成单一职责原则的违背:单例类可能承担过多的责任。
  • 难以进行单元测试:由于全局访问点的存在,单例模式在单元测试中可能会引入依赖性问题。
  • 隐藏的依赖关系:单例模式会在代码中隐藏类与类之间的依赖关系,使得代码变得难以理解和维护。

六、适用场景

  • 需要控制实例数量:例如配置管理类、日志管理类等。
  • 需要提供全局访问点:例如访问数据库连接的类、线程池管理类等。

七、示例的现实应用

单例模式在许多现实应用中都有应用:

  • 配置管理:一个系统的配置通常需要全局访问,但只需要一个实例来管理。
  • 日志记录器:日志记录器通常需要全局访问,但只需要一个实例来管理日志的写入。
  • 数据库连接池:数据库连接池需要管理数据库连接的创建和释放,确保系统中只有一个连接池实例。

通过使用单例模式,可以确保一个类只有一个实例,并提供一个全局访问点来访问该实例,提高系统资源的利用率和全局访问的方便性。


http://www.kler.cn/a/574367.html

相关文章:

  • 智能文档制度管理系统技术
  • istio从入门到精通(1)
  • vue+neo4j 四大名著知识图谱问答系统
  • es 慢查询引起 cpu报警处理方法
  • 计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)
  • Java,Golang,Rust 泛型的大体对比小记
  • 验证测试 .NET 10 预览版的 Windows 窗体中的剪贴板新增功能
  • 【1Panel】平替宝塔面板!1Panel面板香橙派部署结合内网穿透远程管理
  • 第5章:vuex
  • C++ Primer 拷贝控制和资源管理
  • 嵌入式 ARM Linux 系统构成(2):Linux内核层
  • 文本处理Bert面试内容整理-如何使用BERT进行微调?
  • FX-枚举
  • Python编程中常见的10个案例
  • Java爬虫获取淘宝商品搜索接口(item_search)的详细解析
  • C++ Primer 拷贝、赋值与销毁
  • Spring WebFlux 入门指南
  • 计算机视觉之dlib人脸关键点绘制及微笑测试
  • C语言基础之【指针】(下)
  • 【嵌入式通信协议】 I²C 详细介绍