码迷,mamicode.com
首页 > 其他好文 > 详细

软件设计模式之单例模式

时间:2020-07-08 15:20:11      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:远程   lazy   img   线程同步   记录   图片   行操作   idt   readonly   

单例模式的概念:

单例模式保证一个类只有一个实例,并且提供一个访问它的全局访问点;

单例模式存在的意义:

单例模式用于当我们系统中的某个对象只需要一个实例的情况;例如PC远程桌面只能有一个人进行操作一个用户;

实现思路:

(1)、需要确保一个类只有一个实例

    创建公有类、私有构造函数实现;

    

   public class Singleton
    {
        //私有变量来记录Singleton的唯一实例
        private static Singleton singleton;
        //私有构造函数
        private Singleton()
        {
        }
    }    

  

(2)、提供一个访问他的全局访问点

  (2.1)、加锁

  (2.2)、双重锁定

        //定义共有方法来提供该类的唯一全局访问点
        public static Singleton GetInstance()
        {
            /*当第一个线程运行到这里时,此时会对locker对象“加锁”
             * 当第二个线程运行该方法时,首先检测到locker对象为“加锁状态”,该线程就会挂        
              起等待第一个线程解锁
             * lock语句运行完之后(即线程运行完之后)会对该对象解锁
             * 双重锁定只需要一句判断就可以
             * **/
            if (singleton == null)
            {
                lock (locker)
                {
                    //判断该实例是否存在,不存在则new一个新实例,否则返回已有实例
                    if (singleton == null)
                    {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }         

 

总结:

公有类、私有构造函数、全局访问点(判断、加锁、判断)

 

完整源码:

   public class Singleton
    {
        //私有变量来记录Singleton的唯一实例
        private static Singleton singleton;

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

        //私有构造函数
        private Singleton()
        {
        }

      /// <summary>
      /// 定义共有方法来提供该类的唯一全局访问点
      /// </summary>
      /// <returns>实例化对象</returns>

        public static Singleton GetInstance()
        {
            /*当第一个线程运行到这里时,此时会对locker对象“加锁”
             * 当第二个线程运行该方法时,首先检测到locker对象为“加锁状态”,该线程就会挂起等待第一个线程解锁
             * lock语句运行完之后(即线程运行完之后)会对该对象解锁
             * 双重锁定只需要一句判断就可以
             * **/
            if (singleton == null)
            {
                lock (locker)
                {
                    //判断该实例是否存在,不存在则new一个新实例,否则返回已有实例
                    if (singleton == null)
                    {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    } 

 

 

测试:

OK,实现已经结束了,现在来测试下单例模式的效果;

首先在单例模式类中定义一个测试用的字符串

        //测试单例模式效果
        private string strTest;

        public string StrTest { get => strTest; set => strTest = value; }

然后设计测试代码:

        static void Main(string[] args)
        {
            Singleton singleton = Singleton.GetInstance();
            singleton.StrTest = "test";
            Console.WriteLine(singleton.StrTest);
            TestSingleton();
        }

        private static void TestSingleton()
        {
            Singleton singleton = Singleton.GetInstance();
            Console.WriteLine(singleton.StrTest);
        }

  

按照非单例模式上列代码执行结果应该是先显示test,然后显示空串

测试代码:

        static void Main(string[] args)
        {
            Test test = new Test();
            test.StrTest = "test";
            Console.WriteLine(test.StrTest);
       TestSingleton(); } private static void TestSingleton() { Test test = new Test(); Console.WriteLine(test.StrTest); }

  

测试结果:

技术图片

 

运行单例模式测试代码测试结果如下:

技术图片

 

根据上面测试的结果可以知道,无论是重新多少次调用入口,它永远只会让你访问那一个实例!

 

软件设计模式之单例模式

标签:远程   lazy   img   线程同步   记录   图片   行操作   idt   readonly   

原文地址:https://www.cnblogs.com/zhoulei0517/p/13266734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!