博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
23种设计模式--单例模式-Singleton
阅读量:4306 次
发布时间:2019-06-06

本文共 2082 字,大约阅读时间需要 6 分钟。

一、单例模式的介绍

     单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之一,面试经常会问答,所以我们在程序考虑什么地方会用到单例模式,单例模式写法有很多种,这里我下面列举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

    

转载于:https://www.cnblogs.com/yujihaia/p/7468179.html

你可能感兴趣的文章
对于模拟交易所引发的思考
查看>>
高频交易的几种策略
查看>>
量化策略回测TRIXKDJ
查看>>
量化策略回测唐安奇通道
查看>>
CTA策略如何过滤部分震荡行情?
查看>>
量化策略回测DualThrust
查看>>
量化策略回测BoolC
查看>>
量化策略回测DCCV2
查看>>
mongodb查询优化
查看>>
五步git操作搞定Github中fork的项目与原作者同步
查看>>
git 删除远程分支
查看>>
删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
查看>>
python multiprocessing遇到Can’t pickle instancemethod问题
查看>>
APP真机测试及发布
查看>>
通知机制 (Notifications)
查看>>
10 Things You Need To Know About Cocoa Auto Layout
查看>>
一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
查看>>
iOS 如何放大按钮点击热区
查看>>
ios设备唯一标识获取策略
查看>>
获取推送通知的DeviceToken
查看>>