临汾山东漯河饰品美体美文
投稿投诉
美文创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品
漯河衢州
兴义眉山
桂林阳泉
玉溪简阳
山东遂宁
永城新余
梧州洛阳
泸州温州
临汾清远
营口常熟
浙江大连
桐乡宜昌

源码中的设计模式单例模式,学习源码不再难

2月26日 渡缘祠投稿
  一、模式入场
  单例模式在众多的设计模式中应该是最简单的一个,但是要掌握的点也不少。先看下《headfirst设计模式》中给出的释义,
  单件模式确保一个类只有一个实例,并提供一个全局访问点。
  下面对这个释义进行逐字解释。单件可以称之为单例其实是一个意思。这个释义给出了单例模式中重要的两点,一个类只有一个实例;提供一个全局的访问点;
  先说第一条,一个类只有一个实例,在一个系统中会有很多类,如下面的订单类OrderpublicclassOrder{privateStringorderId;privateBigDecimalorderAprivateStringorderP}
  那么现在就有一个问题,如何保证一个类只有一个实例,最先想到的是强制要求这个系统中的所有开发人员,在开发的时候只能实例一次,一个人实例化了,另一个人就不能实例化,这是一个办法,但是却不可行,因为我要实例化这个类的时候总不能先问下其他人,你们实例化过没有,只有其他人没有实例化的前提下你才可以实例化,而且你还要告知其他人以后谁都不能再实例化Order了,这样是不是太傻了,并且效率也太低了,纯靠人为约定肯定是行不通了。有没有其他的方法呐,答案是有的。
  大家都知道,通常情况下实例化一个类,最简单的方式就是new一个,谁说我没有女朋友,new一个啊。现在我们也new一个Order,但是我们发现任何一个人都可以new,这怎么能保证只有一个实例,那么我把它的构造方法设为私有的,这样你们都不能new了吧,能new的只有一个拉,也就是在Order的内部可以new,这就可以保证一个类只有一个实例了,因为只有在类的内部才可以调用其私有的构造方法,其他地方想调用对不起,您没有访问权限。
  好了上面通过把类的构造方法设为私有的,保证了一个类只有一个实例,那么如何才能访问到这个实例呐,假设现在的代码是这样的,publicclassOrder{privateStringorderId;privateBigDecimalorderAprivateStringorderP私有的构造方法privateOrder(){}通过私有构造方法生成的唯一实例OrderordernewOrder();}
  我们现在就要访问到通过私有构造方法生成的实例order,怎么才能访问到呐?提供一个静态方法,静态方法是类级别的,不依赖于实例,可以通过类名。静态方法名的方式访问,如下publicclassOrder{privateStringorderId;privateBigDecimalorderAprivateStringorderP私有的构造方法privateOrder(){}通过私有构造方法生成的唯一实例privatestaticOrderordernewOrder();全局访问点,静态方法returnpublicstaticOrdergetInstance(){}}
  通过提供一个静态方法,由静态方法返回该唯一实例,由于静态方法中要引用order实例,所以该实例也必须是静态的,静态方法是公共的,那么order也应设为私有的,这样就提供了一个全局的访问点,任何地方想使用这个唯一实例调用该静态方法即可。
  好了,到目前为止你已经掌握了一些单例模式的方法。二、深入单例模式
  一般情况下,单例模式分为懒汉和饿汉两种模式,这两种模式很容易记混,我这里有一个好的记忆方式,下面会提到。
  上面的演示中其实就是饿汉模式,下面看懒汉模式,publicclassSingleton{privatestaticS全局访问点,提供singleton实例的唯一访问returnpublicstaticSingletongetInstance(){if(singletonnull){singletonnewSingleton();}}唯一的私有构造函数,提供唯一的实例privateSingleton(){}}
  上面便是懒汉模式。
  对比饿汉模式和懒汉模式,可以发现其区别在于什么时机调用私有的构造方法生成实例,区分方式是,懒汉模式只有在调用全局访问点的时候才会生成实例,而饿汉模式则在类加载的时候便会生成实例,所以根据生成实例的时机去区分饿汉和懒汉就容易的多了。
  这里想留几个思考问题,上面的懒汉模式有问题吗?生成实例的方式除了new还有其他方式吗?三、追寻源码
  在这个模块中想通过源码来学习下单例模式,让大家看看优秀的人是怎么使用单例模式的。1、ErrorContext
  在经常使用的mybatis的源码中有ErrorContext这样的一个类,下面贴出ErrorContext中的部分代码packageorg。apache。ibatis。authorClintonBeginpublicclassErrorContext{privatestaticfinalStringLINESEPARATORSystem。getProperty(line。separator,);privatestaticfinalThreadLocalErrorContextLOCALnewThreadLocal();privateErrorCprivateSprivateSprivateSprivateSprivateSprivateT私有构造方法privateErrorContext(){}全局访问点publicstaticErrorContextinstance(){ErrorContextcontextLOCAL。get();if(contextnull){contextnewErrorContext();LOCAL。set(context);}}}
  在上面的代码中,ErrorContext有私有的构造方法,同时具有instance()方法提供全局唯一访问点,而且从方法我们知道这应该是一个懒汉模式。
  再看下instance()方法,细心的小伙伴会说,这个不是全局唯一访问点,这是从Local变量中取的ErrorContext对象,而Local是ThreadLocal级别的,不是整个系统只有一份啊,这里我要说,大家不必局限于字眼,我们也可以把ThreadLocal看成是一个系统啊,它毕竟是属于线程级别的啊,要真正掌握的是单例的本质,可以仔细体会下。2、LogFactory
  同样是在mybatis的源码中有LogFactory类,局部代码如下,publicfinalclassLogFactory{MarkertobeusedbyloggingimplementationsthatsupportmarkerspublicstaticfinalStringMARKERMYBATIS;privatestaticC?extendsLoglogCstatic{tryImplementation(LogFactory::useSlf4jLogging);tryImplementation(LogFactory::useCommonsLogging);tryImplementation(LogFactory::useLog4J2Logging);tryImplementation(LogFactory::useLog4JLogging);tryImplementation(LogFactory::useJdkLogging);tryImplementation(LogFactory::useNoLogging);}私有构造方法privateLogFactory(){disableconstruction}}
  在该类中可以看到有私有方法,但是却没有提供全局的访问入口,您会说这也是单例模式吗,我说算,这个类符合单例的定义啊,具有私有构造方法肯定只有一个实例,但是却没有创建实例,这个类中其他的方法均是工具方法,为什么不提供全局访问入口,答案是用不到,用不到所以就不提供了啊。3、单例bean
  现在开发中用的最多的就是springboot,springboot的基础是spring,把类交给spring管理使用Autowired就搞定了,您是不是也知道spring中的bean默认都是单例的,没错spring中使用了单例模式,有同学就说了,在平时写的类中也没有提供私有的构造方法啊,是如何保证单例的呐,还记得上边的思考问题吗?除了使用new的方式还有其他的方式,spring使用的是反射的方式,具体代码先不贴了,太多了,一时半会分析不明白,那全局的访问方式呐,答案是beanFactory
  在beanFactory中定义了很多getBean的方法,调用这些方法便会返回一个单例bean,那这些单例bean存储在什么地方那,答案在DefaultSingletonBeanRegistry中,该类中有一个singletonObjects属性,该属性中就存着所有spring管理的单例bean,
  老铁们,看到了吧,这也是单例模式,但这个单例模式比平时自己写的单例模式高明多了,在生成唯一实例时使用的是反射,在提供全局的访问入口的时候,是从hashmap中返回的,比自己写个静态方法高明多了。
  有的小伙伴会问,一个类被spring管理也没提供私有方法,是不是可以自己new啊,是可以的,随便new多少个都行,但是只要被spring管理了默认就是单例的。
  好了,本次就说这么多,我们下次见!
投诉 评论

预算不多,别只盯着骁龙8,这三台天玑8100手机才是最佳选择对于预算不多的朋友来说,选择手机最主要的参考因素那就是性价比,简单说用最少的钱选择配置均衡的手机,这才是核心。如果你选择入手一款2500元价位的手机,搭载骁龙870、骁龙888……海外网友热议LNG不敌RAPandaC段位不超过白银!他不像LNG在LPL夏季赛中以12的战绩不敌RA,爆出了冷门。因为LNG这边有很多世界知名选手,所以这场比赛在海外的关注度也很高,一起来看看他们是如何评价的吧!PandaC将在……剑啸九州新服问剑江湖装备全掉落,交易全自由《剑啸九州》是由糖豆游戏代理的一款怀旧玄幻修仙MMORPG游戏,众所周知一般所有游戏核心的玩法就是养成,其中装备系统是最重要,剑啸九州的装备系统简单明了,所有的装备玩家都能在游……哈维谈德容交易切尔西将对奥巴梅扬进行报价哈维谈德容的交易:不,弗兰基德容不是替补。我不知道市场会发生什么。FCB我可以保证,如果他留下来,他将对我们很重要。XaviondeJongdeal:No,Fren……现役历史前五一览,詹姆斯实至名归,杜兰特风雨飘摇伴随着斯蒂芬库里靠着神级发挥,带领勇士夺得202122赛季NBA总冠军,并以绝对优势摘的FMVP,关于库里的历史地位的言论,再度呼之欲出。联盟新一轮历史地位的排名也在持续发酵,……王者套路太多,提前一个月给玩家下套,这样的做法非常多游戏也是一门学问,黄海绵与粉星今天给大家讲一讲王者荣耀即将发生的大事件。第一件王者荣耀将要更新,s26赛季将要来临。这次更新绝对会迎来众多装备的调整,但个人认……带着段誉的滤镜,也忍不了52岁陈浩民演小生,满屏都是违和感明星艺人想要被观众认识很简单,但要凭借人气吃一辈子的红利,可能就没有那么容易了。特别是那些曾经让观众记忆深刻的演员,淡出观众视野后,就很难再一次翻红,52岁的陈浩民,也不例外。……认真打扮的孟佳真好看,睡袍造型韩范满满,又被美到了品牌好物今天穿什么春节过后迎来了令人向往的初春时节,但寒冷的天气还是让很多女生裹得严严实实,不过严严实实未必代表我们一定要穿得跟个粽子式的毫无美感,在现今越来越多的时尚冬……火箭大逆转击败老鹰,他们状态火热,或许有机会冲击季后赛在詹姆斯哈登离队之后,火箭队的战绩一直很不理想,本赛季也一度排名西部倒数第一。不过此前通过一波七连胜,他们总算摆脱了副班长的位置。而在最近挑战亚特兰大老鹰队的比赛中,火箭在最后……源码中的设计模式单例模式,学习源码不再难一、模式入场单例模式在众多的设计模式中应该是最简单的一个,但是要掌握的点也不少。先看下《headfirst设计模式》中给出的释义,单件模式确保一个类只有一个实例,并……微信绑定了银行卡,转账到账时间记得要设置,不然别人能转走你钱本文编辑今日头条作者维权骑士签约用户:小俊技术分享独家原创制作未经授权严禁转载,发现抄袭者将进行全网维权投诉分享生活小妙招,享受科技新生活!大家好,欢迎来到今天的知……扬帆启航三款航海风格腕表推荐〔腕表之家表款推荐〕腕表设计灵感的来源,不光有天上飞的飞机,地上跑的赛车,自然也少不了跟航海事业产生联系,而且钟表与航海的联系,远要比飞机汽车更加久远。那今天来给大家介绍三款航……
来看看战神5诸神黄昏新增的战斗功能片段砸1亿欧!大巴黎沦为笑柄,中场引援糊弄事,买4个不如曼联买1山东男篮再签一人,国家级强援加盟,王晗又添一助手塔克去年和雄鹿夺冠但我的心态没有变依旧渴望冠军三款旧款旗舰大降价,迎来最佳捡漏时机,超低价格不容错过王者荣耀海月模型海报曝光,新英雄将于下周上线和陌生人骚扰说拜拜!苹果AirDrop隔空投送默认关闭近轨卫星越来越多,科学家发出担忧,或将影响行星防御计划DOTA2TI11中国区预选赛队伍时间公布十三支队伍发起最后武磊和队友踢球的感觉正慢慢找回来巴尔加斯肯定能帮助球队结不结婚到最后都是一个人,人生本来就是孤独的时光过去,年华已逝

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找