23种经典设计模式之单例模式~
首页 > 后端开发   作者: 凌波  2016-6-7 22:13:08  热度:5595°  字号:   评论:
时间:2016-6-7 22:13:08   热度:5595°  评论:  


    说明:
    在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
    如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例?
    这应该是类设计者的责任,而不是类使用者的责任。
    保证一个类仅有一个实例,并提供一个访问它的全局访问点。

   适用性:
   1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
   2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

   在c#中代码实现:

/// <summary>
    /// 单例模式
    /// </summary>
    public class Singleton
    {
        //#region 单线程
        ////保存类的实例
        //private static Singleton uniqueInstance;
        ////禁止实例化
        //private Singleton() { }
        ///// <summary>
        ///// 提供全局访问点
        ///// </summary>
        ///// <returns></returns>
        //public static Singleton GetInstance()
        //{
        //    //不存在就创建,存在就返回
        //    if (uniqueInstance == null)
        //        uniqueInstance = new Singleton();
        //    return uniqueInstance;
        //}
        //#endregion

        #region 多线程 双重加锁

        //定义一个标示确保线程同步
        private static readonly object locker = new object();

        //定义静态实例
        private static Singleton uniqueInstance;

        //禁止实例
        private Singleton() { }

        //定义全局访问点
        public static Singleton GetInstance()
        {
            //第一个线程运行,此时会对locker对象“加锁”
            //第二个线程运行,首先检测locker对象为“加锁”状态,该线程就会挂起等待第一个线程解锁
            //lock语句运行完后,会对该对象“解锁”
            //双重锁定只需要一句话判断就可以了
            if (uniqueInstance == null)
            {
                lock (locker)
                {
                    if (uniqueInstance == null)
                    {
                        uniqueInstance = new Singleton();
                    }
                }
            }
            return uniqueInstance;
        }

        #endregion 多线程 双重加锁
    }
}


 您阅读这篇文章共花了: 
捐赠支持:如果觉得这篇文章对您有帮助,请“扫一扫”鼓励作者!
二维码加载中...
本文作者: 凌波      文章标题: 23种经典设计模式之单例模式~
本文地址:http://www.lingbohome.com/Article/Post/19
版权声明:若无注明,本文皆为“凌波小屋”原创,转载请保留文章出处。

发表吐槽

返回顶部    首页    大事记   动态    捐赠支持    后花园   
版权所有:Copyright ©2016 凌波小屋 All rights All rights reserved    站长: 凌波       程序:.Net Mvc   鄂ICP备 15003636号-1