范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  一、模式入场
  单例模式在众多的设计模式中应该是最简单的一个,但是要掌握的点也不少。先看下《head first 设计模式》中给出的释义,
  单件模式  确保一个类只有一个实例,并提供一个全局访问点。
  下面对这个释义进行逐字解释。单件可以称之为单例其实是一个意思。这个释义给出了单例模式中重要的两点, 一个类只有一个实例; 提供一个全局的访问点;
  先说第一条,一个类只有一个实例,在一个系统中会有很多类,如下面的订单类Order public class Order {  private String orderId; private BigDecimal orderAmount; private String orderPerson; }
  那么现在就有一个问题,如何保证一个类只有一个实例,最先想到的是强制要求这个系统中的所有开发人员,在开发的时候只能实例一次,一个人实例化了,另一个人就不能实例化,这是一个办法,但是却不可行,因为我要实例化这个类的时候总不能先问下其他人,你们实例化过没有,只有其他人没有实例化的前提下你才可以实例化,而且你还要告知其他人以后谁都不能再实例化Order了,这样是不是太傻了,并且效率也太低了,纯靠人为约定肯定是行不通了。有没有其他的方法呐,答案是有的。
  大家都知道,通常情况下实例化一个类,最简单的方式就是new一个,谁说我没有女朋友,new一个啊。现在我们也new一个Order,但是我们发现任何一个人都可以new,这怎么能保证只有一个实例,那么我把它的构造方法设为私有的,这样你们都不能new了吧,能new的只有一个拉,也就是在Order的内部可以new,这就可以保证一个类只有一个实例了,因为只有在类的内部才可以调用其私有的构造方法,其他地方想调用"对不起,您没有访问权限"。
  好了上面通过把类的构造方法设为私有的,保证了一个类只有一个实例,那么如何才能访问到这个实例呐,假设现在的代码是这样的, public class Order {     private String orderId;     private BigDecimal orderAmount;     private String orderPerson;      /**      * 私有的构造方法      */     private Order(){              }      /**      * 通过私有构造方法生成的唯一实例      */     Order order=new Order(); }
  我们现在就要访问到通过私有构造方法生成的实例order,怎么才能访问到呐?提供一个静态方法,静态方法是类级别的,不依赖于实例,可以通过类名.静态方法名的方式访问,如下 public class Order {     private String orderId;     private BigDecimal orderAmount;     private String orderPerson;      /**      * 私有的构造方法      */     private Order(){      }      /**      * 通过私有构造方法生成的唯一实例      */     private static Order order=new Order();      /**      * 全局访问点,静态方法      * @return      */     public static Order getInstance(){         return order;     } }
  通过提供一个静态方法,由静态方法返回该唯一实例,由于静态方法中要引用order实例,所以该实例也必须是静态的,静态方法是公共的,那么order也应设为私有的,这样就提供了一个全局的访问点,任何地方想使用这个唯一实例调用该静态方法即可。
  好了,到目前为止你已经掌握了一些单例模式的方法。 二、深入单例模式
  一般情况下,单例模式分为懒汉和饿汉两种模式,这两种模式很容易记混,我这里有一个好的记忆方式,下面会提到。
  上面的演示中其实就是饿汉模式,下面看懒汉模式, public class Singleton {          private static Singleton singleton;      /**      * 全局访问点,提供singleton实例的唯一访问      * @return      */     public static Singleton getInstance(){         if(singleton==null){             singleton=new Singleton();         }         return singleton;     }      /**      * 唯一的私有构造函数,提供唯一的实例      */     private Singleton(){              }      }
  上面便是懒汉模式。
  对比饿汉模式和懒汉模式,可以发现其区别在于 什么时机调用私有的构造方法生成实例 ,区分方式是, 懒汉模式只有在调用全局访问点的时候才会生成实例,而饿汉模式则在类加载的时候便会生成实例 ,所以根据生成实例的时机去区分饿汉和懒汉就容易的多了。
  这里想留几个思考问题, 上面的懒汉模式有问题吗? 生成实例的方式除了new还有其他方式吗? 三、追寻源码
  在这个模块中想通过源码来学习下单例模式,让大家看看优秀的人是怎么使用单例模式的。 1、ErrorContext
  在经常使用的mybatis的源码中有ErrorContext这样的一个类,下面贴出ErrorContext中的部分代码 package org.apache.ibatis.executor;  /**  * @author Clinton Begin  */ public class ErrorContext {    private static final String LINE_SEPARATOR = System.getProperty("line.separator"," ");   private static final ThreadLocal LOCAL = new ThreadLocal<>();    private ErrorContext stored;   private String resource;   private String activity;   private String object;   private String message;   private String sql;   private Throwable cause;    //私有构造方法   private ErrorContext() {   }   //全局访问点   public static ErrorContext instance() {     ErrorContext context = LOCAL.get();     if (context == null) {       context = new ErrorContext();       LOCAL.set(context);     }     return context;   } }
  在上面的代码中,ErrorContext有私有的构造方法,同时具有instance()方法提供全局唯一访问点,而且从方法我们知道这应该是一个懒汉模式。
  再看下instance()方法,细心的小伙伴会说,这个不是全局唯一访问点,这是从Local变量中取的ErrorContext对象,而Local是ThreadLocal级别的,不是整个系统只有一份啊,这里我要说,大家不必局限于字眼,我们也可以把ThreadLocal看成是一个系统啊,它毕竟是属于线程级别的啊,要真正掌握的是单例的本质,可以仔细体会下。 2、LogFactory
  同样是在mybatis的源码中有LogFactory类,局部代码如下, public final class LogFactory {    /**    * Marker to be used by logging implementations that support markers    */   public static final String MARKER = "MYBATIS";    private static Constructor<? extends Log> logConstructor;    static {     tryImplementation(LogFactory::useSlf4jLogging);     tryImplementation(LogFactory::useCommonsLogging);     tryImplementation(LogFactory::useLog4J2Logging);     tryImplementation(LogFactory::useLog4JLogging);     tryImplementation(LogFactory::useJdkLogging);     tryImplementation(LogFactory::useNoLogging);   } //私有构造方法   private LogFactory() {     // disable construction   } }
  在该类中可以看到有私有方法,但是却没有提供全局的访问入口,您会说这也是单例模式吗,我说算,这个类符合单例的定义啊,具有私有构造方法肯定只有一个实例,但是却没有创建实例,这个类中其他的方法均是工具方法,为什么不提供全局访问入口,答案是用不到,用不到所以就不提供了啊。 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管理了默认就是单例的。
  好了,本次就说这么多,我们下次见!

国内首款量产无人驾驶到底有什么过人之处?最近威马推出了一款全新SUV车威马W6,这辆车除了有过人的外表,他还具备了无人驾驶,做到真正的智能汽车!简单的说下这款威马W6吧,20万级国内首款无人驾驶量产车型,续航有两个版本,8月销量公布,造车新势力座次变更,理想再度卫冕,蔚来掉队日前,造车新势力们纷纷公布了各自8月销量快报,前三巨头可以说变化最大的,就是蔚来汽车,原来一直霸占榜首的,这两个月来销量表现不佳,尤其是8月,直接被哪吒汽车挤到了第四位,理想继续夺赛力斯华为智选SF5完美解决里程忧虑随着新能源汽车的发展,人们纷纷在期待着高性能的新能源汽车出现,赛力斯华为智选SF5诞生之后,新能源汽车终于迎来了新的生机。赛力斯华为智选SF5作为增程式的汽车,和油车以及纯电车的架华为的隐私保护与苹果的拒刷机,手机界的两大痛点华为隐私保护一直走在业界前列。最近荣耀新旗舰机也做到了业界比肩,感到国内高科技企业科技创新历史担当。当前,手机对于我们来说,不仅仅是通讯工具娱乐平台,更是移动办公最佳工具,学习通知华为将推出新手表,复古感十足,仿佛来自中世纪1背景华为智能手表尤其是搭载麒麟芯片的智能手表,一经推出后,就备受消费者青睐。凭借着精致实用,在某东上迅速成为爆款,尽管其价格也不低。当然,销量好的产品,往往容易被聪明的商人抄袭!8月新品盘点三星华为不言,联想小米发声,数量同比上升文焦运杰校对李俊慧团队蓄势待发总在七八月间。暑期档既是销售的黄金期,也是一些新品抢占先机的窗口期。2021年7月,作为暑假的开场,就带给大家不少的惊喜,例如Realme大师版以及华怎么把GMS的软件转到HMS?软件开发者需要付出多大代价?华为HMS4。0正式发布,估计很多开发者都在抉择要不要加入到华为HMS服务中来,但是对国内和国外的开发者来说,他们考虑的点并不相同,海外开发者或者说面向海外发行的APP开发商面临需富瀚微下游市场需求旺盛,上半年迎爆发式增长随着5G物联网消费电子等高新技术的快速发展,带动了专业安防物联网汽车电子等下游应用市场需求旺盛。集成电路产业作为产业链的中上游部分,在旺盛的市场需求推动下,迎来了快速发展时期。近日手机坚持不贴膜,使用一年后,你后悔吗?欢迎在点击右上角关注太平洋电脑网,不定时放送福利哦。我手机没有贴膜,真的没有,买回来之后买了几张钢化膜自己贴,本来想着手艺不错自己弄的。但是贴上之后感觉屏幕素质真的太渣了,而且手感阿里女员工发文被领导性侵,阿里的P7职位属于什么级别的领导?要想知道阿里的P7是什么级别的领导,首先要知道阿里对于岗位级别的设置。在阿里的岗位设置上,分为P岗位,也就是技术岗位以及M岗位,也就是管理岗位。而在阿里的P岗位上,又分为P1一直到为什么用手机自带长焦拍摄效果和外接长焦镜头拍的感觉不一样?众所周知,长焦镜头的体积要比广角镜头大很多。关于这点,不论是单反相机的镜头还是手机镜头都是一样的。很多拥有长焦镜头的手机也都是采用潜望式镜头的方案,其实相当于把镜头做了一个折叠,不
8扬声器2。5K屏幕67W快充骁龙870高生产力的平板推荐第一期手机已经成为现代人不可或缺的工具了,但手机的生产力终究不如平板,一些人喜欢用大屏追剧,用来画画,学习,记笔记,这个时侯拥有一块好的平板就显得尤为重要,下面就来给大家推荐一款高性价比以色列研制出可操控水下1毫米内物体的机械臂新华社耶路撒冷4月6日电(记者王卓伦尚昊)以色列特拉维夫大学研究团队最新研制出一种可以操控水下1毫米内微小物体的机械臂。相关研究发表在美国化学学会应用材料与界面期刊上。这一新研究的废旧手机是座大金矿据德国法兰克福汇报网站3月30日报道,废旧智能手机因其含有的多种元素而成为回收行业的利润来源,实际上可以称之为一种迷你的二手原材料矿场。每个时代都有相应的技术机器和设备19世纪是蒸NFT的升维,元宇宙的进化原创不易点赞加关注,投资不迷路!评论加转发,生活乐哈哈!消息用户对NFT的接受度超预期,二级交易渐占市场主导。Opensea每日活跃用户数在今年年初屡创新高,今年一月份的平台交易额飞凡MARVELR的性价比飞凡汽车的性价比还是比较高的,时间过得好快,自己也成为新能源汽车车主飞凡汽车,今天轮到我来发帖贴了,和大家分享一下飞凡汽车的体验经历。以前自己想买燃油车,比如日产的天籁和大众的帕萨数字货币有几种?首先,央行的数字货币和比特币以及币圈热炒的所谓去中心化数字货币虚拟货币(或者叫数字资产)有很大不同。先说说币圈的数字货币。比特币是目前来说去中心化程度最高的数字货币。比特币诞生的初在京东购物十年悟出的心德第三篇在京东上购物,现在的标准是自营商品要想免运费就要购物满99元。第三方商品免运费标准有各卖家自定的。好多新人不知道这个规则,买了一件商品价格没满99元,被收了6元运费,感觉不划啊,小米之前的logo长这样?有点不可思议2021年小米的logo进行了调整,被网友们调侃这没有变化呀,建议赶快报警吧!自从我们认识到小米,看到小米1的发布会后,其实小米的logo已经比较定型了,原以为这个logo就是小米买了iphone13,反而更喜欢用7plus7p和136s和137p和13我的苹果iphone7plus手机是16年刚上市就买了,256g顶配,当时花了7988元,想想当时真舍得,中间用了6年一直没有换手机。苹果iphoneiOS15。5测试版发布在iOS15。4和iPadOS15。4向公众发布后不久,苹果再次启动了测试版。该公司现在正在向开发人员beta测试人员推出iOS15。5和iPadOS15。5的第一个测试版这可能代2021北京软件和信息技术服务综合实力企业(六十一)大唐移动通信设备有限公司发布日期20220406来源北京软件和信息服务业协会企业简介大唐移动通信设备有限公司(以下简称大唐移动)成立于2002年2月8日,注册资金150113。0586万元,注册地点为北京