• 设计模式——单例模式


    慢慢的做记录,做最强大的自己

    看了大话设计模式之后感触很深,发现自己还有很多学习的东西,设计软件并不是一两句代码把功能写完了就行,需要思考的内容有很多

    代码来源参考大话设计模式这本书,这里在博客里记录一下,不可能每次都去翻书,但是在博客里面是非常好找的。

    单例模式应用场景很多,比如我设置定时器,进行多线程任务管控,多线程的处理在我工作中编写代码的时候还是经常会用到的;或者我的软件中存在多个任务,但只能有

    其中一个在运行;

    单例模式:保证一个类里面只有一个实例,并提供一个访问他的全局访问点。

    这个过程具体是怎么样的,就看一下下面的例子,比如我有一个任务类,我不想其他访问者不断的去new这个任务类,那么我就先私有化,私有化完毕后,再创建一个全局

    访问点

    private static Task Programx;  //定义了一个任务编程x
    
            private Task()                 //先私有化,堵死外界利用new创建这个实例的可能
            {
    
            }
    
            public static Task GetTask()    //利用GetTask方法获得唯一的一个全局访问点
            {
                if (Programx == null)      //如果任务不存在,就new一个,存在就返回已有的
                {
                    Programx = new Task();
                }
                return Programx;
            }

    在使用者进行调用时,就不需要不断的去new这个任务类了,理解起来还是很简单的

     static void Main(string[] args)
            {
                Task T1 = Task.GetTask();
                Task T2 = Task.GetTask();
    
                if (T1 == T2)
                {
                    Console.WriteLine("存在两个相同的任务");
                }
                Console.ReadLine();            
            }

    多线程里面处理又是怎么样的呢,我们知道,多线程处理时可以通过用锁(lock)来阻止线程访问,lock确保当一个线程位于临界区时,另一个线程不进入临界区。如果其他线程试图进入已经被我锁定的代码里面,那么它就会被阻止,除非我释放了当前对象。

    下面这段代码中展示了对象实例由最先进入的那个线程创建,以后在线程再进入的时候就不会去创建对象实例了,也保证了多线程的环境下的同时访问也不会造成多个实例的生成

     class SingleTon
        {
            private static SingleTon instance;
            private static readonly object syncRoot = new object();
    
            private SingleTon()
            {
    
            }
    
            private static SingleTon GetInstance()
            {
                
                    lock (syncRoot)    //在同一时刻只有加锁的才能进去
                    {
                        if (instance == null)          
                        {
                            instance = new SingleTon();
                        }
                    }
                
                return instance;
            }
    
        }

    现在我们看一下双重锁定,上面的例子里面每次都要给线程加锁,双重锁定则只在实例未被创建的时候进行加锁处理,同时也能保证多线程的安全

    class SingleTon
        {
            private static SingleTon instance;
            private static readonly object syncRoot = new object();
    
            private SingleTon()
            {
    
            }
    
            private static SingleTon GetInstance()
            {
                if(instance == null)  //先判断实例是否存在,不存在再加锁处理
                {
                    lock (syncRoot)
                    {
                        if (instance == null)           //双重锁定
                        {
                            instance = new SingleTon();
                        }
                    }
                }
                return instance;
            }
    
        }

    其实单例模式也很简单,归纳一下其实就是去判断实例是否存在,存在的话就直接返回,不存在就new一个实例,使用的人就可以严格的控制这个类不断的被new了

  • 相关阅读:
    DataTable转List<T>
    Ajax跨域解决方案
    日期格式换算
    序列化和反序列化
    C#导出数据量大于100万【csv】
    DataSet转Model
    正则表达式-小数-XML取值验证
    微信绑定欢迎页面
    正则表达式 从X开始到X结束
    html5的新特性有哪些?除了新标签之外还有新的特性?新增的标签主要是为了什么?
  • 原文地址:https://www.cnblogs.com/yinxuejunfeng/p/9600633.html
Copyright © 2020-2023  润新知