欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单例模式 -- 大话设计模式

程序员文章站 2022-06-05 14:06:14
...

在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……

单例模式:保证一个类只有一个实例,并听一个访问它的全局访问点;单例的实现分为两种,懒汉式单例模式和饿汉式单例模式

1.懒汉式单例模式

    public class Singleton
    {
        private static Singleton instance;

        //进程辅助对象,多线程同时访问该类时,对该对象加锁,只有一个线程可以进入
        private static readonly object syncRoot = new object();

        /// <summary>
        /// 定义个私有的构造方法,防止外界通过new创建该类的实例
        /// </summary>
        private Singleton() { }

        /// <summary>
        /// 获取本类实例的唯一全局访问点
        /// </summary>
        public static Singleton GetInstance()
        {
            //先判断实例是否存在,不存在再加锁,提高访问性能
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }

            return instance;
        }

        public void Action()
        {
            Console.WriteLine("我是单例的具体业务……");
        }
    }

 2.饿汉式单例模式

    /// <summary>
    /// 防止派生,派生可能会增加实例
    /// </summary>
    public sealed class Singleton
    {
        //由于定义为readonly,意味着只能在静态初始化期间或者构造函数中分配变量
        private static readonly Singleton instance = new Singleton();

        /// <summary>
        /// 定义个私有的构造方法,防止外界通过new创建该类的实例
        /// </summary>
        private Singleton() { }

        /// <summary>
        /// 获取本类实例的唯一全局访问点(由于定义了静态的只读变量,因此不需要考虑线程安全问题)
        /// </summary>
        public static Singleton GetInstance()
        {
            return instance;
        }

        public void Action()
        {
            Console.WriteLine("我是单例的具体业务……");
        }
    }

   开启场景模拟

        static void Main(string[] args)
        {
            Singleton.GetInstance().Action();
        }