C# 单例模式总结

C# 单例模式总结

技术目标

  单例模式可以说是在开发过程中最常用的一种设计模式了,一般很多业务处理层都会实现单例模式。

  单例模式分为懒汉式和饿汉式,懒汉式是在调用的时候生成唯一的实例,饿汉式是在系统初始化的时候就实现实例。这里有一个有意思的问题,如何在不知道程序的时候,判断单例是懒汉式或者是饿汉式?

  单例的实现是有固定模式的:

  • 私有化构造函数
  • 生产全局唯一静态实例

  那么C#中有几种实现单例的方法呢?目前,我知道的有5中方法

技术过程

  • 懒汉式1 -- 经典双if +

 

 public class S1
    {
        // 1. 私有化构造函数
        private S1()
        {
        }

        // 2. 提供静态实例
        private static readonly object LocObj = new object();

        private static S1 Value;

        public static S1 Instance
        {
            get
            {
                if (Value == null)
                {
                    lock (LocObj)
                    {
                        if (Value == null)
                            Value = new S1();
                    }
                }

                return Value;
            }
        }
    }

 

  

  • 懒汉式2 -- Lazy
 public class S2
    {
        // 1. 私有化构造函数
        public S2()
        {
        }

        // 2. 提供静态实例

        private static Lazy<S2> Value = new Lazy<S2>();

        public static S2 Instance
        {
            get
            {
                return Value.Value;
            }
        }
    }

  

  • 懒汉式3 -- LazyInitializer
 public class S3
    {
        // 1. 私有化构造函数
        private S3()
        {
        }

        // 2. 提供静态实例

        private static S3 Value;

        public static S3 Instance
        {
            get
            {
                return LazyInitializer.EnsureInitialized(ref Value, () => new S3());
            }
        }
    }

  

  • 饿汉式1 -- 静态变量

 

  public class S4
    {
        // 1. 私有化构造函数
        private S4()
        {
        }

        // 2. 提供静态实例

        public static readonly S4 Instance = new S4();
    }

 

  

 

 

  • 饿汉式2 -- 静态构造函数

 

  public class S5
    {
        // 1. 私有化构造函数
        private S5()
        {
        }

        // 2. 提供静态实例

        static S5()
        {
            Instance = new S5();
        }

        public static readonly S5 Instance;
    }

 

  

技术模式

  目前,项目中我主要使用第三种方式,饿汉式的方法提供单例。

存在问题

  大家考虑一个问题,如何在不知道代码的情况下,判断单例是饿汉式的还是懒汉式的?

总结

 

posted @ 2021-03-01 19:18  慢慢zero  阅读(221)  评论(0)    收藏  举报