设计模式二十四讲之《单例模式》

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责
保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。  
区别:饿汉式单例模式,即静态初始化的方式,它是类一加载就实例化的对象,所以要提前占用系统资源。懒汉式单例模式,又会面临着多线程访问的安全性问题,需要做双重锁定这样的处理才 可以保证安全。

使用实例:每个系统的控制类,例如UIManager这种只需要一个存在的用于控制的对象

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

 /// <summary>    
 /// 多线程单例
 /// </summary>
class MultithreadingSingleton
    {    
        private static MultithreadingSingleton instance;
        private static readonly object syncRoot = new object();  //程序运行时创建一个静态只读的进程辅助对象
        private MultithreadingSingleton()
        {
        }
        public static MultithreadingSingleton GetInstance()
        {
            if (instance == null)// 双重锁定,先判断实例是否存在,不存在再加锁处理
            {
                lock (syncRoot) //在同一个时刻加入锁的那部分程序只有一个线程可以进入
                {
                    if (instance == null)                           //    当instance为null并且同时有两个线程调用GetInstance()方法时,它们将都可以通过第一重instance==null的判断,然后由与lock机制,这两个线程则只有一个进入,另一个
                    {                                               //在外排队等待,必须要其中的一个进入并出来后,另一个才能进入。而此时如果没有了第二重的instance是否为null的判断,则第一个线程创建了实例,而第二个线程还是可以继续
                        instance = new MultithreadingSingleton();   //再创建新的实例,这就没有达到单例的目的!
                    }
                }
            }
            return instance;
        }
    }

    /// <summary>
    /// 用于静态初始化演示
    /// 饿汉式单例模式:在自己被加载时就将自己实例化
    /// </summary>
    public sealed  class  SealedSingleton//阻止发生派生,而派生可能增加实例
    {
        private static readonly SealedSingleton instance = new SealedSingleton();//第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化
        private SealedSingleton()
        {

        } 
        public static SealedSingleton GetInstance()
        {
            return instance;
        }
    }

   /// <summary>
   /// 懒汉式单例模式:要在第一次被引用时,才会将自己实例化
   /// </summary>
    class Singleton
    {
        private static Singleton instance;       
        private Singleton()
        {

        }
        public static Singleton GetInstance()
        {
            if(instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }

转载请注明出处!!!

欢迎加入951815219群聊,共享知识,讨论交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值