ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单例模式总结

2019-06-09 10:55:55  阅读:192  来源: 互联网

标签:总结 Singleton Console GEtInstance 模式 Instance 实例 static 单例


**单例模式:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式通常为我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的方法就是,让类自身负责保它的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。

首先让构造方法私有,让外部不能直接new来实例化它,然后创建一个实例化该类的方法,该方法的功能就是创建一个实例之前查看该实例是否被创建,如果已经被创建则不再创建该实例,这样就只有一个实例了。

单例模式:就像是人际关系,每个人都是唯一的(只能实例化一个),你只有了解他你才能和他成为朋友(只有通过该类的方法才能实例化该类)。

第一步写要单例化的对象

 class Singleton
    {
		//创建一个Singleton类的变量
        private static Singleton Instance;
		//让外界不能直接实例化该类
         private  Singleton()
        {
 
        }
		//实例化该类的唯一方法
        public static Singleton GEtInstance()
        {
				//判断该类是否被实例化
                if(Instance==null)
                {
                    Singleton.GEtInstance();
                    Instance = new Singleton();
                    Console.WriteLine("创建新实例");
                    Console.ReadKey();
                }
                
                return Instance ;
               
        }
    }

第二步客户端代码

    static void Main(string[] args)
            {
                Singleton s1 = Singleton.GEtInstance();
                Singleton s2 = Singleton.GEtInstance();
                if(s1==s2)
                {
                    Console.WriteLine("两个对象是相同的实例");
                }
                Console.Read();
            }

多线程时的单例
当多个线程同时访问GEtlnstance方法的时候,可能同时产生多个实例,这时我们就需要用Lock锁,用来防止多线程同时访问此方法。
Lock方法,确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放。
lock锁,是用来访问共享资源的,防止多个线程同时访问公共资源。

class Singleton
    {
        private static Singleton Instance;
      //建立一个值,让程序锁定
        private static object syncRoot = new object ();
        private  Singleton()
        {
 
        }
 
        public static Singleton GEtInstance()
        {
            lock(syncRoot)
            {
    //锁定该值,让该值在同一时间内只能被一个线程访问
                if(Instance==null)
                {
                    Singleton.GEtInstance();
                    Instance = new Singleton();
                    Console.WriteLine("创建新实例");
                    Console.ReadKey();
                }
                
                return Instance ;
                
            }
        }
    }
 

客户端代码

static void Main(string[] args)
        {
            Singleton s1 = Singleton.GEtInstance();
            Singleton s2 = Singleton.GEtInstance();
            if(s1==s2)
            {
                Console.WriteLine("两个对象是相同的实例");
            }
            Console.Read();
        }

双重锁定
因为每次调用GeTInstance 方法,都需要lock方法,这样会影响性能,所以这个类再做改良。

class Singleton
    {
        private static Singleton Instance;
        private static object syncRoot = new object ();
        private  Singleton()
        {
 
        }
 
        public static Singleton GEtInstance()
        {
If(instance==null)
  {
 
            lock(syncRoot)
            {
                if(Instance==null)
                {
                    Singleton.GEtInstance();
                    Instance = new Singleton();
                    Console.WriteLine("创建新实例");
                    Console.ReadKey();
                }
                }
                return Instance ;
 
                
            }
        }
    }

在内部仍然有判断Instance等于null是因为防止多个线程同时通过第一次判断,一个线程进入锁之后创建实例后,若无Instance==null判断,其他实例再次创建实例。

标签:总结,Singleton,Console,GEtInstance,模式,Instance,实例,static,单例
来源: https://blog.csdn.net/weixin_42263618/article/details/91350588

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有