当前位置: 首页 > news >正文

科技有限公司最低注册资金长沙seo优化排名推广

科技有限公司最低注册资金,长沙seo优化排名推广,做户外运动的网站,WordPress副标题隐藏之前我们学习了一些设计模式,今天我们剖析Java JDK 源码中用到的几种常见的设计模式。 1-jdk之工厂模式 在前面讲到工厂模式的时候,大部分工厂类都是以Factory作为后缀来命名,并且工厂类主要负责创建对象这样一件事情。但在实际的项目开发中…

之前我们学习了一些设计模式,今天我们剖析Java JDK 源码中用到的几种常见的设计模式。

1-jdk之工厂模式

       在前面讲到工厂模式的时候,大部分工厂类都是以Factory作为后缀来命名,并且工厂类主要负责创建对象这样一件事情。但在实际的项目开发中,工厂类的设计更加灵活。那我们就来看下,工厂模式在Java JDK中的一个应用:java.util.Calendar。

public static Calendar getInstance(){return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}private static Calendar createCalendar(TimeZone zone,Locale aLocale){CalendarProvider provider =LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale).getCalendarProvider();if (provider != null) {try {return provider.getInstance(zone, aLocale);} catch (IllegalArgumentException iae) {// fall back to the default instantiation}}Calendar cal = null;if (aLocale.hasExtensions()) {String caltype = aLocale.getUnicodeLocaleType("ca");if (caltype != null) {switch (caltype) {case "buddhist":cal = new BuddhistCalendar(zone, aLocale);break;case "japanese":cal = new JapaneseImperialCalendar(zone, aLocale);break;case "gregory":cal = new GregorianCalendar(zone, aLocale);break;}}}if (cal == null) {if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {cal = new BuddhistCalendar(zone, aLocale);} else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"&& aLocale.getCountry() == "JP") {cal = new JapaneseImperialCalendar(zone, aLocale);} else {cal = new GregorianCalendar(zone, aLocale);}}return cal;}

       getInstance()方法可以根据不同TimeZone和Locale,创建不同的Calendar子类对象,比如BuddhistCalendar、JapaneseImperialCalendar、GregorianCalendar,这些细节完全封装在工厂方法createCalendar中,使用者只需要传递当前的时区和地址,就能够获得一个Calendar类对象来使用,而获得的对象具体是哪个Calendar子类的对象,使用者在使用的时候并不关心。

2-jdk之建造者模式

        建造者模式有两种实现方法,一种是单独定义一个Builder类,另一种是将Builder实现为原始类的内部类。Calendar就采用了第二种实现思路。

  public static class Builder {private static final int NFIELDS = FIELD_COUNT + 1; // +1 for WEEK_YEARprivate static final int WEEK_YEAR = FIELD_COUNT;private long instant;//省略其他的成员变量}

        在Builder里面还有build方法来创建Calendar类对象;既然已经有了getInstance()工厂方法来创建Calendar类对象,为什么还要用Builder来创建Calendar类对象呢?这两者之间的区别在哪里呢?工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。建造者模式用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。

       粗看Calendar的Builder类的build()方法,你可能会觉得它有点像工厂模式。你的感觉没错,前面一半代码确实跟getInstance()工厂方法类似,根据不同的type创建了不同的Calendar子类。实际上,后面一半代码才属于标准的建造者模式,根据setXXX()方法设置的参数,来定制化刚刚创建的Calendar子类对象。

3-jdk之装饰器模式

      Java IO类库是装饰器模式的非常经典的应用。实际上,Java的Collections类也用到了装饰器模式。Collections类是一个集合容器的工具类,提供了很多静态方法,用来创建各种集合容器,比如通过unmodifiableColletion()静态方法,来创建UnmodifiableCollection类对象。而这些容器类中的UnmodifiableCollection类、CheckedCollection和SynchronizedCollection类,就是针对Collection类的装饰器类。

       装饰器模式中的装饰器类是对原始类功能的增强。UnmodifiableCollection的构造函数接收一个Collection类对象,然后对其所有的函数进行了包裹(Wrap):重新实现(比如add()函数)或者简单封装(比如stream()函数)。而简单的接口实现或者继承,并不会如此来实现UnmodifiableCollection类。所以,从代码实现的角度来说,UnmodifiableCollection类是典型的装饰器类。

4-jdk之适配器模式

      老版本的JDK提供了Enumeration类来遍历容器。新版本的JDK用Iterator类替代Enumeration类来遍历容器。为了兼容老的客户端代码(使用老版本JDK的代码),我们保留了Enumeration类,并且在Collections类中,仍然保留了enumaration()静态方法(因为我们一般都是通过这个静态函数来创建一个容器的Enumeration类对象)。

       在新版本的JDK中,Enumeration类是适配器类。它适配的是客户端代码(使用Enumeration类)和新版本JDK中新的迭代器Iterator类。不过,从代码实现的角度来说,这个适配器模式的代码实现,跟经典的适配器模式的代码实现,差别稍微有点大。enumeration()静态函数的逻辑和Enumeration适配器类的代码耦合在一起,enumeration()静态函数直接通过new的方式创建了匿名类对象。 

public static <T> Enumeration<T> enumeration(final Collection<T> c) {return new Enumeration<T>() {private final Iterator<T> i = c.iterator();public boolean hasMoreElements() {return i.hasNext();}public T nextElement() {return i.next();}};
}

 5-jdk之模板模式

      Java中的Collections类的sort()函数就是利用了模板模式的这个扩展特性。Collections.sort()实现了对集合的排序。为了扩展性,它将其中“比较大小”这部分逻辑,委派给用户来实现。如果我们把比较大小这部分逻辑看作整个排序逻辑的其中一个步骤,那我们就可以把它看作模板模式。不过,从代码实现的角度来看,它看起来有点类似之前讲过的JdbcTemplate,并不是模板模式的经典代码实现,而是基于Callback回调机制来实现的。

6-jdk之观察者模式

       之前我们讲解观察者模式的时候说到Google Guava的EventBus框架,它提供了观察者模式的骨架代码,使用EventBus。Java JDK也提供了观察者模式的简单框架实现。只包含两个类:java.util.Observable和java.util.Observer。前者是被观察者,后者是观察者。

7-jdk之单例模式

      JDK中java.lang.Runtime类就是一个单例类。每个Java应用在运行时会启动一个JVM进程,每个JVM进程都只对应一个Runtime实例,用于查看JVM状态以及控制JVM行为。进程内唯一,所以比较适合设计为单例。在编程的时候,我们不能自己去实例化一个Runtime对象,只能通过getRuntime()静态方法来获得。它使用了最简单的饿汉式的单例实现方式。

public class Runtime {private static Runtime currentRuntime = new Runtime();public static Runtime getRuntime() {return currentRuntime;}/** Don't let anyone else instantiate this class */private Runtime() {}//....public void addShutdownHook(Thread hook) {SecurityManager sm = System.getSecurityManager();if (sm != null) {sm.checkPermission(new RuntimePermission("shutdownHooks"));}ApplicationShutdownHooks.add(hook);}//.

8-jdk之其他模式

享元模式,Integer类中的-128~127之间的整型对象是可以复用的,还讲到String类型中的常量字符串也是可以复用的。这些都是享元模式的经典应用。

职责链模式,Java Servlet中的Filter就是通过职责链来实现的,同时还对比了Spring中的interceptor。实际上,拦截器、过滤器这些功能绝大部分都是采用职责链模式来实现的。

迭代器模式,重点剖析了Java中Iterator迭代器的实现。

http://www.hrbkazy.com/news/13928.html

相关文章:

  • 网站建设的日程表网站优化师
  • 手机网站建设公司热线电话抖音权重查询
  • 佛山从事网站建设长春seo整站优化
  • 淘宝客网站怎么做seo韩国网站
  • 什么是新闻源网站seo广告平台
  • 免费b2b网站平台湖北seo公司
  • 温州机械网站建设如何免费创建自己的网站平台
  • 网络优化工程师现状泉州seo优化
  • 如何查看网站的建设方式成都网站快速排名
  • 陕西做教学成果网站的公司品牌推广的步骤和技巧
  • 网站设计需要什么软件品牌网络推广
  • 网站建设销售一个月开几个单免费个人网站空间
  • 网站推广系统方案谷歌广告
  • 北京手机网站建设公司seo工具软件
  • 一个服务器可以备案几个网站吗百度直播间
  • 多张图做网站背景广州公司关键词网络推广
  • 可以做微网站的第三方平台怎么做链接推广产品
  • 石家庄政府网站建设win7优化配置的方法
  • 百度网站优化培训网络口碑营销案例分析
  • 网站建设教程集体苏州久远网络武汉新一轮疫情
  • 南昌那个公司做网站好快速优化网站排名的方法
  • 没有页面的网站怎么做性能测试优化大师app下载安装
  • 网站建设名词解析十大it教育培训机构排名
  • 广东网站建设公司郑州网络推广平台
  • 成都网站asp access源码购买修改seo搜索引擎优化介绍
  • php网站开发实例教材优化神马排名软件
  • 桂林旅游网站制作公司安卓优化大师下载
  • 电商网站开发过程淘宝关键词排名
  • 优惠卷网站怎么做推广seo专员
  • iis 与 wordpressseo标题优化步骤