C# 23种设计模式(1)单例模式(单件模式)

一、单例模式介绍

单例模式(Singleton Pattern) 是一种创建型设计模式,++它确保一个类只有一个实例,并提供一个全局访问点++。这个模式在需要一个对象被共享且全局唯一的情况下非常有用,比如配置对象、日志对象、数据库连接对象等。

单例模式的主要作用包括:

  1. 提供全局唯一的访问点,方便代码调用和管理。
  2. 避免不必要的内存开销和资源浪费,因为只有一个实例存在。
  3. 提高代码的可维护性和可扩展性,因为修改单例对象的行为非常方便。

然而,单例模式也存在一些缺点,如可能导致职责过多线程安全问题测试困难等。因此,在使用单例模式时需要谨慎考虑其适用场景和潜在问题。

二、单例模式代码实现

在C#中,单例模式的实现方法有多种,常见的包括:

1. 饿汉式 (Eager Initialization)

饿汉式在类加载时就创建实例,线程安全但可能浪费资源(如果实例从未被使用)。

cs 复制代码
public sealed class SingletonEager
{
    private static readonly SingletonEager _instance = new SingletonEager();

    // 私有构造函数防止外部实例化
    private SingletonEager()
    {
    }
    //其他类通过SingletonEager.Instance来调用这个类的唯一实例
    public static SingletonEager Instance
    {
        get { return _instance; }
    }

    // 其他方法和属性...
}

2. 懒汉式 (Lazy Initialization)

懒汉式在第一次使用时才创建实例,但需要注意线程安全问题。这里为了预防线程安全,加了一个lock。在多线程调用这个类的单例时,先得到lock的线程调用实例时,其他线程会等待。

cs 复制代码
public class SingletonLazy
{
    // volatile确保当instance变量被初始化成Instance时,多个线程能够正确处理instance变量
    private static volatile SingletonLazy _instance;
    // 锁定对象
    private static readonly object _lock = new object();

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

    public static SingletonLazy Instance
    {
        get
        {
            lock (_lock) // 加锁
            {
                if (_instance == null) 
                {
                    _instance = new SingletonLazy();
                }
            }

            return _instance;
        }
    }

    // 其他方法和属性...
}

3. 双重检查锁定 (Double-Checked Locking with volatile)

判断两次if (_instance == null) ,在几十几百个线程都使用这个实例时就不用排队等待锁了,避免了线程堵塞。并且使用了volatile关键字以避免指令重排序问题。

cs 复制代码
public class SingletonDoubleChecked
{
    // 使用volatile确保多线程正确处理instance的可见性
    private static volatile SingletonDoubleChecked _instance;
    // 锁定对象
    private static readonly object _lock = new object();

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

    public static SingletonDoubleChecked Instance
    {
        get
        {
            if (_instance == null) // 第一次检查
            {
                lock (_lock) // 加锁
                {
                    if (_instance == null) // 第二次检查
                    {
                        _instance = new SingletonDoubleChecked();
                    }
                }
            }
            return _instance;
        }
    }

    // 其他方法和属性...
}
相关推荐
菜鸟一枚在这2 小时前
深入解析设计模式之单例模式
开发语言·javascript·单例模式
FLZJ_KL2 小时前
【设计模式】【创建型模式】单例模式(Singleton)
java·单例模式·设计模式
非 白4 小时前
【Java】单例模式
java·笔记·单例模式
万兴丶4 小时前
Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)
数据结构·unity·设计模式·c#
菜鸟一枚在这4 小时前
深入剖析抽象工厂模式:设计模式中的架构利器
设计模式·架构·抽象工厂模式
码熔burning4 小时前
(三)趣学设计模式 之 抽象工厂模式!
设计模式·抽象工厂模式
程序猿多布5 小时前
C#设计模式 学习笔记
设计模式·c#
強云10 小时前
23种设计模式 - 模板方法
设计模式·模板方法
workflower16 小时前
Prompt Engineering的重要性
大数据·人工智能·设计模式·prompt·软件工程·需求分析·ai编程
ox008019 小时前
C++ 设计模式-中介者模式
c++·设计模式·中介者模式