《创建型-C#单例模式》

单例模式(ObserverPattern)

意图:在GOF一书中阐述的非常明确——“让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点”,简单理解就是你定义的Class (类) 只会被new 一次。

  1. 场景:
    1.1生成全局订单号,订单号必须保持唯一,如果多次new 订单类容易出现重复id 。
    1.2创建全局日志访问帮助类。
    1.3创建全局配置访问帮助类 。
  2. 需求:
    我有一个配置文件,现在读取方法也已经写好了,需要你封装一个单例确保全局调用他的时候只会被实例化一次。

C# 实现代码

 ConfigSingleton.cs
 //sealed  :被修饰的类或方法不能被重写或继承
    //internal 只有在同一程序集的文件中,内部类型或成员才可访问
    public sealed class ConfigSingleton
    {

        private ConfigSingleton() { }
        private static ConfigSingleton _instance;
        public static ConfigSingleton GetInstance() {
            if (_instance == null)
            {
                _instance = new ConfigSingleton();* 
            }
            return _instance;
        }

        //方法
        public  void WriteLog()
        {
            Console.WriteLine("执行方法:WriteLog()");
        }
    }

Program.cs

 static void Main(string[] args)
        {
            // 传统调用方式  一 new 一个对象然后调用
            // var config = new ConfigSingleton();报错
            var config = ConfigSingleton.GetInstance();
            config.WriteLog();
            Console.WriteLine("Hello World!");
       }

当然这是最简单的一类,由此可以简单理解为 单例能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
** 后来有前辈实际使用中,发现上述单例还有优化空间,他们提出更多优化方案,针对不同需求的场景,以下单例实现的方式**

  • 饿汉式
        private static readonly ConfigSingleton _instance = new ConfigSingleton();
        public static ConfigSingleton  GetInstance {
            get {
                return _instance;
            }
        }
  • 懒汉式

    private static  readonly Lazy<ConfigSingleton> lazy = new Lazy<ConfigSingleton>(() => new ConfigSingleton());

        /// <summary>
        /// () =>new ConfigSingleton()这句话只是C#的一种语法糖,匿名委托会提及
        /// </summary>
        /// <returns></returns>
        public static ConfigSingleton GetInstance
       { 
            get { return lazy.Value; }
        }

posted @ 2022-11-30 13:44  毛毛君h  阅读(67)  评论(0)    收藏  举报