SingletonPattern-单例模式

ZHIZRL / 2023-08-02 / 原文

在C#中,单例模式(Singleton Pattern)用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式常用于需要限制某个类只能创建一个对象的场景,例如数据库连接、日志记录器等。

  1. 懒汉式(Lazy Initialization)

    这种实现方式使用了双重检查锁定(双IF加锁),即在获取实例前先检查实例是否已经存在,如果不存在再使用锁进行同步。这种方式延迟了实例的创建,只有在需要使用实例时才会进行创建。该实现是线程安全的,并且能够在多线程环境下保证只有一个实例。

    public class Singleton
    {
        private static Singleton instance;
        private static readonly object lockObj = new object();
    
        private Singleton() { }
    
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockObj)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }
  2. 饿汉式(Eager Initialization)
    这种实现方式在类加载时就创建了实例,所以称为饿汉式。在多线程环境下也能保证只有一个实例,但可能会在程序启动时就创建实例,有一定的内存开销。
    public class Singleton
    {
        private static readonly Singleton instance = new Singleton();
    
        private Singleton() { }
    
        public static Singleton Instance
        {
            get { return instance; }
        }
    }
  3. 静态构造函数(Static Constructor)
    这种实现方式利用了C#的静态构造函数,在第一次使用Singleton类时执行静态构造函数并创建实例。它也能保证在多线程环境下只有一个实例。
    public class Singleton
    {
        private static readonly Singleton instance;
    
        private Singleton() { }
    
        static Singleton()
        {
            instance = new Singleton();
        }
    
        public static Singleton Instance
        {
            get { return instance; }
        }
    }