设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123426 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

76 | 开源实战一(上):通过剖析Java JDK源码学习灵活应用设计模式

适配器模式
装饰器模式
建造者模式
工厂模式
Java JDK中设计模式的应用

该思维导图由 AI 生成,仅供参考

从今天开始,我们就正式地进入到实战环节。实战环节包括两部分,一部分是开源项目实战,另一部分是项目实战。
在开源项目实战部分,我会带你剖析几个经典的开源项目中用到的设计原则、思想和模式,这其中就包括对 Java JDK、Unix、Google Guava、Spring、MyBatis 这样五个开源项目的分析。在项目实战部分,我们精心挑选了几个实战项目,手把手地带你利用之前学过的设计原则、思想、模式,来对它们进行分析、设计和代码实现,这其中就包括鉴权限流、幂等重试、灰度发布这样三个项目。
接下来的两节课,我们重点剖析 Java JDK 中用到的几种常见的设计模式。学习的目的是让你体会,在真实的项目开发中,要学会活学活用,切不可过于死板,生搬硬套设计模式的设计与实现。除此之外,针对每个模式,我们不可能像前面学习理论知识那样,分析得细致入微,很多都是点到为止。在已经具备之前理论知识的前提下,我想你可以跟着我的指引自己去研究,有哪里不懂的话,也可以再回过头去看下之前的理论讲解。
话不多说,让我们正式开始今天的学习吧!

工厂模式在 Calendar 类中的应用

在前面讲到工厂模式的时候,大部分工厂类都是以 Factory 作为后缀来命名,并且工厂类主要负责创建对象这样一件事情。但在实际的项目开发中,工厂类的设计更加灵活。那我们就来看下,工厂模式在 Java JDK 中的一个应用:java.util.Calendar。从命名上,我们无法看出它是一个工厂类。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Java JDK源码中灵活应用了设计模式,通过分析Calendar类的工厂模式和建造者模式的应用,展示了设计模式在实际项目中的灵活运用。在工厂模式中,Calendar类的getInstance()方法根据不同的TimeZone和Locale创建不同的Calendar子类对象,将功能代码和工厂方法代码耦合在一个类中,展现了工厂模式的灵活设计。而在建造者模式中,Calendar类的Builder类通过设置不同的可选参数,定制化地创建不同的Calendar子类对象,展现了建造者模式的应用。文章强调了不要过于死板地套用各种模式的原理和实现,而是要了解模式的本质,灵活应用并甚至混合使用各种模式,创造出新的模式来解决特定场景的问题。这样的实践精神和灵活运用设计模式的思路,对于读者在实际项目开发中的指导意义重大。 此外,文章还介绍了装饰器模式和适配器模式在Java JDK中的应用。Collections类中的UnmodifiableCollection类被解释为典型的装饰器类,通过包裹原始类的函数实现功能增强。而在适配器模式中,Enumeration类被用作适配器类,兼容老版本JDK的接口。这些实际案例展示了设计模式在Java JDK中的灵活应用,强调了在实际项目中,设计模式的应用更加灵活,可以根据具体的业务场景和功能需求做出调整,甚至对模式本身的设计思路做出调整。 总的来说,本文通过具体的案例展示了设计模式在Java JDK中的灵活应用,强调了在实际项目中要灵活运用设计模式,结合实际情况做灵活调整,切不可生搬硬套。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • Laughing
    我个人理解是建造者模式的典型实现。虽然只有append方法,但是每个append的参数构造是不同的,从方面也反映出,append的方法可以通过不同的参数构造不同的String。当然该类也不只是只有append的参数,还有例如insert delete参数。以上说明符合建造者模式中所要解决的构建复杂对象的目的。

    作者回复: 嗯嗯 ������

    2020-11-27
    22
  • Darren
    我觉得是,因为StringBuilder的主要方法append,其实就是类似于建造者模式中的set方法,只不过构建者模式的set方法可能是对象的不同属性,但append其实是在一直修改一个属性,且最后没有build(),但StringBuilder出现的目的其实是为了解决String不可变的问题,最终输出其实是String,所以可以类比toString()就是build(),所以认为算是建造者模式。
    2020-04-27
    90
  • 辣么大
    StringBuilder没有使用建造者模式,只是名字碰巧用了builder这个单词。它只是用来构建可变字符串,仅此而已,别想太多。
    2020-05-01
    25
  • 小晏子
    课后思考: 我的答案是算也不算…,如果按照学院派的思想,stringbuilder和GOF中的对于builder模式的定义完全不同,stringbuilder并不会创建新的string对象,只是将多个字符连接在一起,而builder模式的基本功能是生成新对象,两个本质就不一样了,从这个角度来讲,stringbuilder不能算是builder模式。 那为什么又说算呢?这样从另外一个角度想,stringbuilder得到的字符串是一步一步append出来的,这个builder模式的一步一步set在build的行为很像,因为文中也说了不要太学院派,要灵活使用,那么从这个角度来说可以认为stringbuilder也是属于builder的一种实现,只是它不是典型实现。
    2020-04-27
    1
    11
  • Jxin
    回答课后题: 我认为应该算是建造者模式。 拿餐厅类比,对于披萨加番茄,起司等不同配料来定制披萨,这属于建造者模式要解决的问题(实例对象的定制)。而stringbuild的应用场景,更像是对披萨加一个番茄还是两个番茄更或者三个番茄的定制方式(某个字段的定制)。 所以strbuild的应用场景比传统的建造者模式更细更具体(前者实现字段的定制,后者实现对象的定制)。但字段定制依旧属于对象定制的范涛,所以我认为其依旧算是建造者模式。
    2020-04-27
    8
  • 守拙
    课堂讨论: StringBuilder应用了Builder模式. 其主要方式是append(), 即通过不断append创建复杂对象. 不同于传统Builder模式的是: 1. StringBuilder的目的是创建String, 但StringBuilder并不是String的内部类. 2. StringBuilder的创建过程可以断续, 传统的Builder模式一次性填入参数后调用build()方法创建对象. 3. StringBuilder通过内部维护字符数组(char[])的方式实现拼接.
    2020-04-27
    5
  • QQ怪
    StringBuilder的append()方法使用了建造者模式,StringBuilder把构建者的角色交给了其的父类AbstractStringBuilder,最终调用的是父类的append()方法
    2020-04-27
    5
  • Richie
    The intent of the Builder design pattern is to separate the construction of a complex object from its representation. By doing so the same construction process can create different representations. 从StringBuilder的代码实现来看,他通过append方法来设置其value属性,最终使用toString()方法来创建对象。这符合建造者模式的定义。这跟我们平时使用的建造者模式唯一的不同就是他一直设置的是同一个属性,而平时我们会设置多个属性,并最终调用build()方法来创建对象。
    2020-05-08
    1
    4
  • javaadu
    StringBuilder并没有使用构造者模式,从设计意图上看这俩不是一回事—构造者模式得意图是为同一个类生成不同定制需求的对象,而StringBuilder的设计意图是为了实现可变更的字符串来优化内存占用
    2020-05-03
    3
  • Demon.Lee
    如果说要创建一个复杂的String对象,那么通过StringBuilder的append()方法会非常方便,最后通过toString()方法返回,从这个角度看算建造者模式。 @Override public String toString() { // Create a copy, don't share the array return new String(value, 0, count); }
    2020-04-27
    3
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部