ICode9

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

设计模式-单例模式

2022-08-19 15:03:58  阅读:147  来源: 互联网

标签:Singleton 模式 instance 实例 static 单例 new 设计模式


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

  如何保证一个对象呐?

    私有的构造函数,保证外界不能直接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

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

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

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

ICode9版权所有