• 23种设计模式--单例模式-Singleton


    一、单例模式的介绍

         单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之一,面试经常会问答,所以我们在程序考虑什么地方会用到单例模式,单例模式写法有很多种,这里我下面列举2种写法很普遍的写法,然后做个多线程计数的例子大家来理解一下单例模式的用法。

    二、单例模式Demo

         /// <summary>
        /// 利用C#的特性单例模式
        /// </summary>

         public sealed  class SampleSingleton1
        {
            private int m_Counter = 0;
            private SampleSingleton1()
            {
                Console.WriteLine("初始化SampleSingle1");
            }

            public static readonly SampleSingleton1 singleton = new SampleSingleton1();
            /// <summary>
            /// 调用次数计数器
            /// </summary>
            public void Counter()
            {
                m_Counter++;
            }
        }

        /// <summary>
        /// 线程安全的单例模式
        /// </summary>
        public  class SampleSingleton2
        {
            private static volatile SampleSingleton2 m_Instance = null;
            private int m_Counter = 0;
            private SampleSingleton2()
            {
                Console.WriteLine("初始化SampleSingleton2.");
            }
            public static SampleSingleton2 Singleton
            {
                get
                {
                    if (m_Instance == null)
                    {
                        lock (typeof(SampleSingleton2))
                        {
                            if (m_Instance == null)
                            {
                                m_Instance = new SampleSingleton2();
                            }
                        }
                    }
                    return m_Instance;
                }
            }
            /// <summary>
            /// 调用计数器
            /// </summary>
            public void Couter()
            {
                m_Counter++;
            }
        }

         /// <summary>
        /// 测试2种模式的效率和调用的方式
        /// </summary>

                DateTime milestone;
                int maxCallTimes= 100000000;

                // 第一次调用SampleSingleton1的Counter方法
                Console.WriteLine("第一次调用SampleSingleton1的Counter方法");
                SampleSingleton1.singleton.Counter();

                // 计算10000次调用的耗费时间
                milestone = DateTime.Now;
                for (int i = 0; i < maxCallTimes; i++)
                {
                    SampleSingleton1.singleton.Counter();
                }
                Console.WriteLine(maxCallTimes.ToString() + "次调用执行时间为:" + ((TimeSpan)(DateTime.Now - milestone)).TotalMilliseconds.ToString());
                Console.WriteLine("");


                // 第一次调用SampleSingleton2的Counter方法
                Console.WriteLine("第一次调用SampleSingleton2的Counter方法");
                SampleSingleton2.Singleton.Couter();

                // 计算10000次调用的耗费时间
                milestone = DateTime.Now;
                for (int i = 0; i < maxCallTimes; i++)
                {
                    SampleSingleton2.Singleton.Couter();
                }
                Console.WriteLine(maxCallTimes.ToString() + "次调用执行时间为:" + ((TimeSpan)(DateTime.Now - milestone)).TotalMilliseconds.ToString());

                string str = Console.ReadLine();
            }

     三、GitHub的地址

           https://github.com/wangtongzhou520/Designpattern

        

  • 相关阅读:
    [转]ion-slide-box
    [转]Ionic 实现双击返回键退出功能
    [转]highcharts图表入门之:如何让highcharts图表自适应浏览器窗体的大小或者页面大小
    [转]ionic Accordion list three levels
    [转]ionic $state.go passed $stateParams
    [转]ionic tab view hide tab bar
    [转]Ionic + AngularJS angular-translate 国际化本地化解决方案
    [转]Ionic Datepicker
    [转]通过AngularJS directive对bootstrap日期控件的的简单包装
    [转]轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
  • 原文地址:https://www.cnblogs.com/yujihaia/p/7468179.html
Copyright © 2020-2023  润新知