其他分享
首页 > 其他分享> > 设计模式-单例模式

设计模式-单例模式

作者:互联网

单例模式:简单地说就是一个 实例即一个对象,全局只用这一个对象。

  如何保证一个对象呐?

    私有的构造函数,保证外界不能直接new 一个对象,那么就保证了单一性;

  但是只是不让外界new,但是第一个对象怎么来呐?

    那就要在单例中创建一个方法,以用来创造这第一个对象,其他地方想要用,直接调用这个方法即可!

  

 class Singleton
    {
        //单例模式结构:

        private static Singleton instance;

        // 私有构造方法Singleton(),外界不能使用new关键字来创建此类的实例了。

        private Singleton()
        {

        }
        //方法GetInstance(), 此方法是本类实例的唯一全局访问点。

        public static Singleton GetInstance()
        {
            //如实例不存在,则New一个新实例,否则返回已有实例

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

        }
    }

==========以上就是 单例模式的基本 结构

 

  如果在多线程的情况下,单例模式会不会被破坏,创造出多个实例。答案是会的,会出现这种情况,那么如何补救?就需要 加锁了

  

class Singleton
    {
        //单例模式结构:

        private static Singleton instance;

        // 私有构造方法Singleton(),外界不能使用new关键字来创建此类的实例了。


        private static readonly object _object = new object();//创建锁
        private Singleton()
        {

        }
        //方法GetInstance(), 此方法是本类实例的唯一全局访问点。

        public static Singleton GetInstance()
        {
            //如实例不存在,则New一个新实例,否则返回已有实例           

            if (instance == null)
            {
                //现在还不能直接创建,要加锁,让线程一个个进来
                lock (_object) 
                {
                    //一个个进来如果还是  null 的话,就说明确实没有创建实例了
                    if (instance==null)
                    {
                        instance = new Singleton();
                    }
                }
                
            }
            return instance;

        }
    }

  加上锁的话,就更能保证单例模式的运行了

 

============题外话:什么时候使用  锁?=>  当多个线程调用同一个方法时,会需要锁 阻塞一下线程

标签:Singleton,模式,instance,实例,static,单例,new,设计模式
来源: https://www.cnblogs.com/messi-10/p/16601974.html