《从零学Java设计模式》[78M]百度网盘|pdf下载|亲测有效
《从零学Java设计模式》[78M]百度网盘|pdf下载|亲测有效
《从零学Java设计模式》[78M]百度网盘|pdf下载|亲测有效

从零学Java设计模式 pdf下载

isbn:9787111759782
出版社 机械工业出版社
出版年 2024-09-01
页数 210页
ISBN 9787111759782
装帧 精装
评分 9.4(豆瓣)
限时特惠 00:00:00
活动结束后恢复原价
纸质书参考价 ¥23
电子版限时价 ¥5.99 省 18 元

选择版本

不满意全额退款
发货失败双倍赔偿
邮箱即时发送

内容简介

本篇主要提供从零学Java设计模式电子书的pdf版本下载,本电子书下载方式为百度网盘方式,点击以上按钮下单完成后即会通过邮件和网页的方式发货,有问题请联系邮箱ebook666@outlook.com

编辑推荐

适读人群 :本书写给所有求知若渴的软件工程师,他们想要详细了解Java平台以及Java语言的新特性,以求提升软件设计水平。

设计模式的种类繁多,并且不断有新的模式出现,本书涵盖了23种传统的设计模式、11 种较为常见的模式,以及8种适用于多线程环境的并发模式。另外,本书还简要介绍了13种负面模式(即反模式)。作者讲解这些模式的时候,不仅给出了简洁、直观的范例代码,而且还利用UML类图与JFR工具展示了运用该模式的程序所具备的架构及运行细节,让读者能够更全面地了解模式对代码结构的影响,以及模式与Java虚拟机的交互情况。

内容简介

本书以实用的设计模式为例,讲解了Java近年来在改善语法方面取得的进展,同时在实现这些模式的过程中展示了语言特性、设计模式与平台效率之间的关系。本书涵盖23种传统的设计模式、11种较为常见的模式,以及8种适用于多线程环境的并发模式。另外,本书还简要介绍了15种反模式。作者讲解这些模式的时候不仅给出了简洁、直观的范例代码,而且还利用UML类图与JFR工具展示了运用该模式的程序所具备的架构及运行细节,让读者能够更全面地了解模式对代码结构的影响,以及模式与Java虚拟机的交互情况。本书的特点在于把Java这种成熟的编程语言以及该语言最近新增的特性与各种设计模式结合起来,告诉读者怎样充分发挥Java的特性与优势,从而更好地实现设计模式,避免陷入空谈概念而无法落实的境地。

作者简介

米罗斯拉夫·威格纳(Miroslav Wengner)是一位热衷于弹性分布式系统与产品质量的软件工程师。他参与了Robo4J项目(一个针对机器人及物联网的响应式软实时框架),还为OpenJDK做出了贡献,并参与了其他开源技术项目。他致力于构建弹性、可扩展的解决方案。他入选了Java Champions Program,被评为JavaOne Rockstar,也是JCP的执行委员会委员。他目前在OpenValue公司担任首席软件工程师,工作之余,他还在JavaOne、Devoxx等技术会议和博客上分享自己的心得。他很看好Java生态系统,并帮助它变得更好。

目录

译者序

前 言
审校者简介
第一部分 设计模式与Java平台的功能
第1章 软件设计模式入门 3
1.1 技术准备 3
1.2 编程:从符号到程序 3
1.3 OOP与APIE 5
1.3.1 封装—只公布那些必须公布的信息 6
1.3.2 继承—在应该创造新类的时候创造 6
1.3.3 多态—根据需要表现出不同的行为 7
1.3.4 抽象—从细节中提取一套标准功能 9
1.3.5 把抽象、多态、继承、封装这四个概念贯穿起来 11
1.4 SOLID设计原则 12
1.4.1 单一功能原则—每个类只负责一件事 13
1.4.2 开闭原则 13
1.4.3 里氏替换原则—子类必须能够当作超类来使用 14
1.4.4 接口隔离原则 15
1.4.5 依赖反转原则 17
1.5 设计模式为何如此重要 18
1.6 设计模式能够解决哪些问题 18
1.7 小结 20
1.8 习题 21
1.9 参考资料 21
第2章 Java平台 22
2.1 技术准备 22
2.2 Java是如何诞生的 22
2.3 Java平台的模型与功能 23
2.3.1 JDK 24
2.3.2 JRE 25
2.3.3 JVM 25
2.4 垃圾收集机制与Java内存模型 30
2.4.1 JMM 30
2.4.2 GC与自动内存管理 32
2.5 Java的核心API 35
2.5.1 原始类型与包装器类型 36
2.5.2 与String有关的API 37
2.5.3 数组 39
2.5.4 Java集合框架 40
2.5.5 Math API 42
2.6 函数式编程与Java 43
2.6.1 lambda与函数接口 43
2.6.2 用匿名类与lambda表达式充当函数接口并在Stream API中使用 44
2.7 Java的模块系统 45
2.8 Java语言在第11~17版之间添加的特性 48
2.8.1 允许使用var关键字声明lambda表达式的参数(Java SE 11,JEP-323) 48
2.8.2 switch表达式(Java SE 14,JEP-361) 49
2.8.3 文本块(Java SE 15,JEP-378) 49
2.8.4 instanceof运算符的模式匹配功能(Java SE 16,JEP-394) 50
2.8.5 record(Java SE 16,JEP-395) 50
2.8.6 sealed类(Java SE 17,JEP-409) 50
2.8.7 Java API采用UTF-8作为默认字符集(Java SE 18,JEP-400) 51
2.8.8 带有模式匹配功能的switch(Java SE 18,Second Preview,JEP-420) 52
2.9 Java的并发 52
2.9.1 从线程到执行器 52
2.9.2 执行任务的两种方式 54
2.10 小结 55
2.11 习题 56
2.12 参考资料 56
第二部分 用Java语言实现标准的设计模式
第3章 创建型设计模式 61
3.1 技术准备 61
3.2 从类怎么变成对象说起 61
3.3 工厂方法模式—根据输入的数据创建对象 63
3.3.1 动机 63
3.3.2 该模式在JDK中的运用 63
3.3.3 范例代码 64
3.3.4 模式小结 66
3.4 抽象工厂模式—用适当的工厂方法创建某个系列的产品 66
3.4.1 动机 67
3.4.2 该模式在JDK中的运用 67
3.4.3 范例代码 67
3.4.4 模式小结 69
3.5 建造者模式—实例化复杂的对象 70
3.5.1 动机 70
3.5.2 该模式在JDK中的运用 70
3.5.3 范例代码 71
3.5.4 模式小结 72
3.6 原型模式—克隆对象 73
3.6.1 动机 73
3.6.2 该模式在JDK中的运用 73
3.6.3 范例代码 74
3.6.4 模式小结 76
3.7 单例模式—确保某个类只存在一个实例 77
3.7.1 动机 77
3.7.2 该模式在JDK中的运用 77
3.7.3 范例代码 77
3.7.4 模式小结 79
3.8 对象池模式—提高性能 80
3.8.1 动机 80
3.8.2 该模式在JDK中的运用 80
3.8.3 范例代码 80
3.8.4 模式小结 82
3.9 惰性初始化模式—按需初始化对象 83
3.9.1 动机 83
3.9.2 该模式在JDK中的运用 83
3.9.3 范例代码 84
3.9.4 模式小结 86
3.10 依赖注入模式—减少类之间的依赖关系 86
3.10.1 动机 86
3.10.2 该模式在JDK中的运用 87
3.10.3 范例代码 87
3.10.4 模式小结 90
3.11 小结 91
3.12 习题 92
3.13 参考资料 92
第4章 结构型设计模式 93
4.1 技术准备 93
4.2 适配器模式—让不兼容的对象变得兼容 93
4.2.1 动机 93
4.2.2 该模式在JDK中的运用 94
4.2.3 范例代码 94
4.2.4 模式小结 97
4.3 桥接模式—独立地解耦对象和开发对象 97
4.3.1 动机 97
4.3.2 该模式在JDK中的运用 97
4.3.3 范例代码 98
4.3.4 模式小结 100
4.4 组合模式—用相同的方式处理不同的对象 100
4.4.1 动机 100
4.4.2 该模式在JDK中的运用 100
4.4.3 范例代码 101
4.4.4 模式小结 102
4.5 修饰器模式—扩展对象的功能 102
4.5.1 动机 102
4.5.2 该模式在JDK中的运用 103
4.5.3 范例代码 103
4.5.4 模式小结 105
4.6 外观模式—简化程序与某一群对象之间的通信逻辑 105
4.6.1 动机 105
4.6.2 该模式在JDK中的运用 105
4.6.3 范例代码 106
4.6.4 模式小结 107
4.7 过滤器模式—根据条件选出需要的对象 107
4.7.1 动机 107
4.7.2 该模式在JDK中的运用 107
4.7.3 范例代码 107
4.7.4 模式小结 110

4.8 享元模式—跨应用程序共享对象 110

4.8.1 动机 110

4.8.2 该模式在JDK中的运用 110

4.8.3 范例代码 110

4.8.4 模式小结 112

4.9 前端控制器模式—统一处理请求 112

4.9.1 动机 112

4.9.2 该模式在JDK中的运用 113

4.9.3 范例代码 113

4.9.4 模式小结 115

4.10 标记模式—识别实例 115

4.10.1 动机 115

4.10.2 该模式在JDK中的运用 115

4.10.3 范例代码 116

4.10.4 模式小结 118

4.11 模块模式—利用模块的概念来管理各个组件 118

4.11.1 动机 118

4.11.2 该模式在JDK中的运用 118

4.11.3 范例代码 118

4.11.4 模式小结 120

4.12 代理模式—为对象提供占位符 120

4.12.1 动机 120

4.12.2 该模式在JDK中的运用 121

4.12.3 范例代码 121

4.12.4 模式小结 122

4.13 孪生模式—在Java语言中实现多重继承 122

4.13.1 动机 122

4.13.2 范例代码 123

4.13.3 模式小结 124

4.14 小结 124

4.15 习题 125

4.16 参考资料 125

第5章 行为型设计模式 126

5.1 技术准备 126

5.2 缓存模式—降低程序开销 126

5.2.1 动机 127

5.2.2 该模式在JDK中的运用 127

5.2.3 范例代码 127

5.2.4 模式小结 129

5.3 责任链模式—清晰而灵活地处理事件 129

5.3.1 动机 129

5.3.2 该模式在JDK中的运用 130

5.3.3 范例代码 130

5.3.4 模式小结 131

5.4 命令模式—把信息转化成相应的动作 132

5.4.1 动机 132

5.4.2 该模式在JDK中的运用 132

5.4.3 范例代码 132

5.4.4 模式小结 133

5.5 解释器模式—赋予上下文意义 134

5.5.1 动机 134

5.5.2 该模式在JDK中的运用 134

5.5.3 范例代码 134

5.5.4 模式小结 136

5.6 迭代器模式—检查所有元素 136

5.6.1 动机 136

5.6.2 该模式在JDK中的运用 136

5.6.3 范例代码 136

5.6.4 模式小结 138

5.7 中介者模式—让对象之间更好地交换信息 138

5.7.1 动机 138

5.7.2 该模式在JDK中的运用 139

5.7.3 范例代码 139

5.7.4 模式小结 140

5.8 备忘录模式—把对象恢复到应有的状态 140

5.8.1 动机 140

5.8.2 该模式在JDK中的运用 140

5.8.3 范例代码 140

5.8.4 模式小结 142

5.9 空对象模式—避免空指针异常 143

5.9.1 动机 143

5.9.2 该模式在JDK中的运用 143

5.9.3 范例代码 143

5.9.4 模式小结 144

5.10 观察者模式—让相关各方都得到通知 145

5.10.1 动机 145

5.10.2 该模式在JDK中的运用 145

5.10.3 范例代码 145

5.10.4 模式小结 146

5.11 管道模式—处理实例阶段 146

5.11.1 动机 147

5.11.2 该模式在JDK中的运用 147

5.11.3 范例代码 147

5.11.4 模式小结 148

5.12 状态模式—变更对象的内部行为 149

5.12.1 动机 149

5.12.2 该模式在JDK中的运用 149

5.12.3 范例代码 149

5.12.4 模式小结 150

5.13 策略模式—切换对象的行为 150

5.13.1 动机 151

5.13.2 该模式在JDK中的运用 151

5.13.3 范例代码 151

5.13.4 模式小结 152

5.14 模板模式—制定标准的处理流程 153

5.14.1 动机 153

5.14.2 该模式在JDK中的运用 153

5.14.3 范例代码 153

5.14.4 模式小结 155

5.15 访问者模式—根据对象的类型执行代码 155

5.15.1 动机 155

5.15.2 该模式在JDK中的运用 155

5.15.3 范例代码 155

5.15.4 模式小结 157

5.16 小结 158

5.17 习题 158

5.18 参考资料 159

第三部分 其他重要的模式与反模式

第6章 并发设计模式 163

6.1 技术准备 163

6.2 主动对象模式—解耦方法的执行时机与触发时机 164

6.2.1 动机 164

6.2.2 范例代码 164

6.2.3 模式小结 167

6.3 异步方法调用模式—让任务以非阻塞的方式执行 167

6.3.1 动机 167

6.3.2 范例代码 167

6.3.3 模式小结 169

6.4 阻行模式—延迟执行,直到前一个任务完成 170

6.4.1 动机 171

6.4.2 范例代码 171

6.4.3 模式小结 173

6.5 双重检查锁模式—提供唯一的对象实例 173

6.5.1 动机 173

6.5.2 范例代码 174

6.5.3 模式小结 176

6.6 读写锁模式—实现有目的的线程阻塞 176

6.6.1 动机 176

6.6.2 范例代码 177

6.6.3 模式小结 178

6.7 生产者–消费者模式—解耦执行逻辑 180

6.7.1 动机 180

6.7.2 范例代码 180

6.7.3 模式小结 181

6.8 调度器模式—执行孤立的任务 182

6.8.1 动机 182

6.8.2 范例代码 183

6.8.3 模式小结 187

6.9 线程池模式—有效地利用线程 187

6.9.1 动机 187

6.9.2 范例代码 187

6.9.3 模式小结 188

6.10 小结 189

6.11 习题 190

6.12 参考资料 190

第7章 常见的反模式 191

7.1 技术准备 192

7.2 什么是反模式,怎样发现反模式 192

7.2.1 从是否违背开发原则的角度发现反模式 192

7.2.2 注意那些有可能形成瓶颈的技术债务 192

7.2.3 不要错误地使用Java平台的功能 193

7.2.4 选择合适的工具 195

7.2.5 代码坏味反模式小结 196

7.3 认识软件开发中常见的反模式 197

7.3.1 意大利面条式的代码 197

7.3.2 复制粘贴式编程 198

7.3.3 blob 198

7.3.4 熔岩流 199

7.3.5 功能分散 199

7.3.6 船锚 199

7.3.7 软件开发中的反模式小结 200

7.4 软件架构中的反模式 200

7.4.1 金锤 200

7.4.2 频繁更替 200

7.4.3 输入问题 201

7.4.4 雷区探险 201

7.4.5 用意不明 202

7.4.6 幽灵 202

7.4.7 死路 202

7.4.8 软件架构中的反模式小结 203

7.5 小结 203

7.6 参考资料 204

习题参考答案 205

第1章 205

第2章 205

第3章 206

第4章 206

第5章 207

第6章 207

前言/序言

前  言
Java语言是一种工具,能够跟一套相当丰富的平台进行交互,这套平台提供了许多用来开发应用程序的特性。本书以实用的设计模式为例,讲解了Java近年来在改善语法方面取得的进展,同时在实现这些模式的过程中展示了语言特性、设计模式与平台效率之间的关系。大家会看到怎样用这些理论基础提升源代码的效率,令代码更加易于维护与测试。这些内容能够帮助读者应对各类任务,让大家知道如何用可持续且清晰透明的方案处理各种编程难题。

目标读者
本书写给所有求知若渴的软件工程师,他们想要详细了解Java平台以及Java语言的新特性,以求提升软件设计水平。

本书内容
第1章讲解与源代码设计结构有关的基础知识,以及一些能够让代码易于维护、易于阅读的原则。
第2章讲解Java平台这一丰富而强大的工具。该章会详细讲解Java平台的特性、功能和设计,为理解Java设计模式的目标与价值奠定基础。
第3章讲解对象实例化,这是所有应用程序的关键部分。该章介绍了如何在牢记需求的前提下做好对象实例化。
第4章讲解如何编写源代码,以便清楚地表示程序用到的对象之间的关系。
第5章讲解如何编写源代码,让对象可以进行通信和交换信息,同时保持代码透明。
第6章讲解Java平台及其并发环境的本质。理解了这一点,我们就能明白如何利用并发来更好地满足应用程序的需求。
第7章讲解我们在开发应用程序的过程中可能会遇到的反模式。该章将告诉你这些反模式出现的缘由、如何识别反模式,并提出一些消除反模式的办法。

准备工作
为了执行书中的源代码与指令,你需要安装下列工具:
软件/硬件 操作系统
(必须安装)Java Development Kit(JDK)17或更新的版本 Windows、macOS或Linux
(建议安装)IDE(Integrated Development Environment,集成开发环境)VSCode 1.73.1或更新的版本 Windows、macOS或Linux
(必须安装)某种文本编辑器或IDE Windows、macOS或Linux

本书要求安装JDK 17或更新版本。请在操作系统中执行下列命令,以检查系统中是否安装了JDK:
如果用的是Windows系统,那就打开命令提示符(Command Prompt)窗口,并执行java–version命令。
如果用的是Linux或macOS系统,那就在命令提示符(或者终端)界面执行java–version命令。
如果执行结果如下,则说明系统已经安装了JDK:

如果你的计算机还没安装JDK,那就访问https://dev.java/learn/getting-started-with-java/页面,按照其中给出的步骤安装JDK。网页(https://jdk.java.net/archive/)给出了适用于各种操作系统的JDK安装包,你可以从中选择自己想要安装的版本。
请访问https://code.visualstudio.com/download以下载并安装Visual Studio Code(简称VSCode)。
VSCode终端界面的用法参见https://code.visualstudio.com/docs/terminal/
basics。

下载范例代码
书中的范例代码及其更新可以从https://github.com/PacktPublishing/Practical-
Design-Patterns-for-Java-Developers下载。

下载彩色图像
我们还提供了一份PDF文件,书中的截图与彩色图像都能在该文件中找到。它的下载网址是https://packt.link/nSLEf。

排版约定
本书使用了以下排版约定。
代码体:表示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入,以及Twitter账户名。例如, “我们来看看开发Vehicle类的一般流程。”
代码块如下所示:

如果某段代码中有一些内容需要强调,那么相关的行或项会加粗:

命令行界面里的输入与输出如下所示:

粗体:表示新术语、重要词汇或出现在屏幕上的文字(例如,菜单或对话框中的文字就会印刷成粗体)。例如,“字节码运行在Java虚拟机(Java Virtual Machine,JVM)中。”
提示或者重要说明
这些内容放在文本框中。


编辑推荐

适读人群 :本书写给所有求知若渴的软件工程师,他们想要详细了解Java平台以及Java语言的新特性,以求提升软件设计水平。

设计模式的种类繁多,并且不断有新的模式出现,本书涵盖了23种传统的设计模式、11 种较为常见的模式,以及8种适用于多线程环境的并发模式。另外,本书还简要介绍了13种负面模式(即反模式)。作者讲解这些模式的时候,不仅给出了简洁、直观的范例代码,而且还利用UML类图与JFR工具展示了运用该模式的程序所具备的架构及运行细节,让读者能够更全面地了解模式对代码结构的影响,以及模式与Java虚拟机的交互情况。

内容简介

本书以实用的设计模式为例,讲解了Java近年来在改善语法方面取得的进展,同时在实现这些模式的过程中展示了语言特性、设计模式与平台效率之间的关系。本书涵盖23种传统的设计模式、11种较为常见的模式,以及8种适用于多线程环境的并发模式。另外,本书还简要介绍了15种反模式。作者讲解这些模式的时候不仅给出了简洁、直观的范例代码,而且还利用UML类图与JFR工具展示了运用该模式的程序所具备的架构及运行细节,让读者能够更全面地了解模式对代码结构的影响,以及模式与Java虚拟机的交互情况。本书的特点在于把Java这种成熟的编程语言以及该语言最近新增的特性与各种设计模式结合起来,告诉读者怎样充分发挥Java的特性与优势,从而更好地实现设计模式,避免陷入空谈概念而无法落实的境地。

作者简介

米罗斯拉夫·威格纳(Miroslav Wengner)是一位热衷于弹性分布式系统与产品质量的软件工程师。他参与了Robo4J项目(一个针对机器人及物联网的响应式软实时框架),还为OpenJDK做出了贡献,并参与了其他开源技术项目。他致力于构建弹性、可扩展的解决方案。他入选了Java Champions Program,被评为JavaOne Rockstar,也是JCP的执行委员会委员。他目前在OpenValue公司担任首席软件工程师,工作之余,他还在JavaOne、Devoxx等技术会议和博客上分享自己的心得。他很看好Java生态系统,并帮助它变得更好。

目录

译者序

前 言
审校者简介
第一部分 设计模式与Java平台的功能
第1章 软件设计模式入门 3
1.1 技术准备 3
1.2 编程:从符号到程序 3
1.3 OOP与APIE 5
1.3.1 封装—只公布那些必须公布的信息 6
1.3.2 继承—在应该创造新类的时候创造 6
1.3.3 多态—根据需要表现出不同的行为 7
1.3.4 抽象—从细节中提取一套标准功能 9
1.3.5 把抽象、多态、继承、封装这四个概念贯穿起来 11
1.4 SOLID设计原则 12
1.4.1 单一功能原则—每个类只负责一件事 13
1.4.2 开闭原则 13
1.4.3 里氏替换原则—子类必须能够当作超类来使用 14
1.4.4 接口隔离原则 15
1.4.5 依赖反转原则 17
1.5 设计模式为何如此重要 18
1.6 设计模式能够解决哪些问题 18
1.7 小结 20
1.8 习题 21
1.9 参考资料 21
第2章 Java平台 22
2.1 技术准备 22
2.2 Java是如何诞生的 22
2.3 Java平台的模型与功能 23
2.3.1 JDK 24
2.3.2 JRE 25
2.3.3 JVM 25
2.4 垃圾收集机制与Java内存模型 30
2.4.1 JMM 30
2.4.2 GC与自动内存管理 32
2.5 Java的核心API 35
2.5.1 原始类型与包装器类型 36
2.5.2 与String有关的API 37
2.5.3 数组 39
2.5.4 Java集合框架 40
2.5.5 Math API 42
2.6 函数式编程与Java 43
2.6.1 lambda与函数接口 43
2.6.2 用匿名类与lambda表达式充当函数接口并在Stream API中使用 44
2.7 Java的模块系统 45
2.8 Java语言在第11~17版之间添加的特性 48
2.8.1 允许使用var关键字声明lambda表达式的参数(Java SE 11,JEP-323) 48
2.8.2 switch表达式(Java SE 14,JEP-361) 49
2.8.3 文本块(Java SE 15,JEP-378) 49
2.8.4 instanceof运算符的模式匹配功能(Java SE 16,JEP-394) 50
2.8.5 record(Java SE 16,JEP-395) 50
2.8.6 sealed类(Java SE 17,JEP-409) 50
2.8.7 Java API采用UTF-8作为默认字符集(Java SE 18,JEP-400) 51
2.8.8 带有模式匹配功能的switch(Java SE 18,Second Preview,JEP-420) 52
2.9 Java的并发 52
2.9.1 从线程到执行器 52
2.9.2 执行任务的两种方式 54
2.10 小结 55
2.11 习题 56
2.12 参考资料 56
第二部分 用Java语言实现标准的设计模式
第3章 创建型设计模式 61
3.1 技术准备 61
3.2 从类怎么变成对象说起 61
3.3 工厂方法模式—根据输入的数据创建对象 63
3.3.1 动机 63
3.3.2 该模式在JDK中的运用 63
3.3.3 范例代码 64
3.3.4 模式小结 66
3.4 抽象工厂模式—用适当的工厂方法创建某个系列的产品 66
3.4.1 动机 67
3.4.2 该模式在JDK中的运用 67
3.4.3 范例代码 67
3.4.4 模式小结 69
3.5 建造者模式—实例化复杂的对象 70
3.5.1 动机 70
3.5.2 该模式在JDK中的运用 70
3.5.3 范例代码 71
3.5.4 模式小结 72
3.6 原型模式—克隆对象 73
3.6.1 动机 73
3.6.2 该模式在JDK中的运用 73
3.6.3 范例代码 74
3.6.4 模式小结 76
3.7 单例模式—确保某个类只存在一个实例 77
3.7.1 动机 77
3.7.2 该模式在JDK中的运用 77
3.7.3 范例代码 77
3.7.4 模式小结 79
3.8 对象池模式—提高性能 80
3.8.1 动机 80
3.8.2 该模式在JDK中的运用 80
3.8.3 范例代码 80
3.8.4 模式小结 82
3.9 惰性初始化模式—按需初始化对象 83
3.9.1 动机 83
3.9.2 该模式在JDK中的运用 83
3.9.3 范例代码 84
3.9.4 模式小结 86
3.10 依赖注入模式—减少类之间的依赖关系 86
3.10.1 动机 86
3.10.2 该模式在JDK中的运用 87
3.10.3 范例代码 87
3.10.4 模式小结 90
3.11 小结 91
3.12 习题 92
3.13 参考资料 92
第4章 结构型设计模式 93
4.1 技术准备 93
4.2 适配器模式—让不兼容的对象变得兼容 93
4.2.1 动机 93
4.2.2 该模式在JDK中的运用 94
4.2.3 范例代码 94
4.2.4 模式小结 97
4.3 桥接模式—独立地解耦对象和开发对象 97
4.3.1 动机 97
4.3.2 该模式在JDK中的运用 97
4.3.3 范例代码 98
4.3.4 模式小结 100
4.4 组合模式—用相同的方式处理不同的对象 100
4.4.1 动机 100
4.4.2 该模式在JDK中的运用 100
4.4.3 范例代码 101
4.4.4 模式小结 102
4.5 修饰器模式—扩展对象的功能 102
4.5.1 动机 102
4.5.2 该模式在JDK中的运用 103
4.5.3 范例代码 103
4.5.4 模式小结 105
4.6 外观模式—简化程序与某一群对象之间的通信逻辑 105
4.6.1 动机 105
4.6.2 该模式在JDK中的运用 105
4.6.3 范例代码 106
4.6.4 模式小结 107
4.7 过滤器模式—根据条件选出需要的对象 107
4.7.1 动机 107
4.7.2 该模式在JDK中的运用 107
4.7.3 范例代码 107
4.7.4 模式小结 110

4.8 享元模式—跨应用程序共享对象 110

4.8.1 动机 110

4.8.2 该模式在JDK中的运用 110

4.8.3 范例代码 110

4.8.4 模式小结 112

4.9 前端控制器模式—统一处理请求 112

4.9.1 动机 112

4.9.2 该模式在JDK中的运用 113

4.9.3 范例代码 113

4.9.4 模式小结 115

4.10 标记模式—识别实例 115

4.10.1 动机 115

4.10.2 该模式在JDK中的运用 115

4.10.3 范例代码 116

4.10.4 模式小结 118

4.11 模块模式—利用模块的概念来管理各个组件 118

4.11.1 动机 118

4.11.2 该模式在JDK中的运用 118

4.11.3 范例代码 118

4.11.4 模式小结 120

4.12 代理模式—为对象提供占位符 120

4.12.1 动机 120

4.12.2 该模式在JDK中的运用 121

4.12.3 范例代码 121

4.12.4 模式小结 122

4.13 孪生模式—在Java语言中实现多重继承 122

4.13.1 动机 122

4.13.2 范例代码 123

4.13.3 模式小结 124

4.14 小结 124

4.15 习题 125

4.16 参考资料 125

第5章 行为型设计模式 126

5.1 技术准备 126

5.2 缓存模式—降低程序开销 126

5.2.1 动机 127

5.2.2 该模式在JDK中的运用 127

5.2.3 范例代码 127

5.2.4 模式小结 129

5.3 责任链模式—清晰而灵活地处理事件 129

5.3.1 动机 129

5.3.2 该模式在JDK中的运用 130

5.3.3 范例代码 130

5.3.4 模式小结 131

5.4 命令模式—把信息转化成相应的动作 132

5.4.1 动机 132

5.4.2 该模式在JDK中的运用 132

5.4.3 范例代码 132

5.4.4 模式小结 133

5.5 解释器模式—赋予上下文意义 134

5.5.1 动机 134

5.5.2 该模式在JDK中的运用 134

5.5.3 范例代码 134

5.5.4 模式小结 136

5.6 迭代器模式—检查所有元素 136

5.6.1 动机 136

5.6.2 该模式在JDK中的运用 136

5.6.3 范例代码 136

5.6.4 模式小结 138

5.7 中介者模式—让对象之间更好地交换信息 138

5.7.1 动机 138

5.7.2 该模式在JDK中的运用 139

5.7.3 范例代码 139

5.7.4 模式小结 140

5.8 备忘录模式—把对象恢复到应有的状态 140

5.8.1 动机 140

5.8.2 该模式在JDK中的运用 140

5.8.3 范例代码 140

5.8.4 模式小结 142

5.9 空对象模式—避免空指针异常 143

5.9.1 动机 143

5.9.2 该模式在JDK中的运用 143

5.9.3 范例代码 143

5.9.4 模式小结 144

5.10 观察者模式—让相关各方都得到通知 145

5.10.1 动机 145

5.10.2 该模式在JDK中的运用 145

5.10.3 范例代码 145

5.10.4 模式小结 146

5.11 管道模式—处理实例阶段 146

5.11.1 动机 147

5.11.2 该模式在JDK中的运用 147

5.11.3 范例代码 147

5.11.4 模式小结 148

5.12 状态模式—变更对象的内部行为 149

5.12.1 动机 149

5.12.2 该模式在JDK中的运用 149

5.12.3 范例代码 149

5.12.4 模式小结 150

5.13 策略模式—切换对象的行为 150

5.13.1 动机 151

5.13.2 该模式在JDK中的运用 151

5.13.3 范例代码 151

5.13.4 模式小结 152

5.14 模板模式—制定标准的处理流程 153

5.14.1 动机 153

5.14.2 该模式在JDK中的运用 153

5.14.3 范例代码 153

5.14.4 模式小结 155

5.15 访问者模式—根据对象的类型执行代码 155

5.15.1 动机 155

5.15.2 该模式在JDK中的运用 155

5.15.3 范例代码 155

5.15.4 模式小结 157

5.16 小结 158

5.17 习题 158

5.18 参考资料 159

第三部分 其他重要的模式与反模式

第6章 并发设计模式 163

6.1 技术准备 163

6.2 主动对象模式—解耦方法的执行时机与触发时机 164

6.2.1 动机 164

6.2.2 范例代码 164

6.2.3 模式小结 167

6.3 异步方法调用模式—让任务以非阻塞的方式执行 167

6.3.1 动机 167

6.3.2 范例代码 167

6.3.3 模式小结 169

6.4 阻行模式—延迟执行,直到前一个任务完成 170

6.4.1 动机 171

6.4.2 范例代码 171

6.4.3 模式小结 173

6.5 双重检查锁模式—提供唯一的对象实例 173

6.5.1 动机 173

6.5.2 范例代码 174

6.5.3 模式小结 176

6.6 读写锁模式—实现有目的的线程阻塞 176

6.6.1 动机 176

6.6.2 范例代码 177

6.6.3 模式小结 178

6.7 生产者–消费者模式—解耦执行逻辑 180

6.7.1 动机 180

6.7.2 范例代码 180

6.7.3 模式小结 181

6.8 调度器模式—执行孤立的任务 182

6.8.1 动机 182

6.8.2 范例代码 183

6.8.3 模式小结 187

6.9 线程池模式—有效地利用线程 187

6.9.1 动机 187

6.9.2 范例代码 187

6.9.3 模式小结 188

6.10 小结 189

6.11 习题 190

6.12 参考资料 190

第7章 常见的反模式 191

7.1 技术准备 192

7.2 什么是反模式,怎样发现反模式 192

7.2.1 从是否违背开发原则的角度发现反模式 192

7.2.2 注意那些有可能形成瓶颈的技术债务 192

7.2.3 不要错误地使用Java平台的功能 193

7.2.4 选择合适的工具 195

7.2.5 代码坏味反模式小结 196

7.3 认识软件开发中常见的反模式 197

7.3.1 意大利面条式的代码 197

7.3.2 复制粘贴式编程 198

7.3.3 blob 198

7.3.4 熔岩流 199

7.3.5 功能分散 199

7.3.6 船锚 199

7.3.7 软件开发中的反模式小结 200

7.4 软件架构中的反模式 200

7.4.1 金锤 200

7.4.2 频繁更替 200

7.4.3 输入问题 201

7.4.4 雷区探险 201

7.4.5 用意不明 202

7.4.6 幽灵 202

7.4.7 死路 202

7.4.8 软件架构中的反模式小结 203

7.5 小结 203

7.6 参考资料 204

习题参考答案 205

第1章 205

第2章 205

第3章 206

第4章 206

第5章 207

第6章 207

前言/序言

前  言
Java语言是一种工具,能够跟一套相当丰富的平台进行交互,这套平台提供了许多用来开发应用程序的特性。本书以实用的设计模式为例,讲解了Java近年来在改善语法方面取得的进展,同时在实现这些模式的过程中展示了语言特性、设计模式与平台效率之间的关系。大家会看到怎样用这些理论基础提升源代码的效率,令代码更加易于维护与测试。这些内容能够帮助读者应对各类任务,让大家知道如何用可持续且清晰透明的方案处理各种编程难题。

目标读者
本书写给所有求知若渴的软件工程师,他们想要详细了解Java平台以及Java语言的新特性,以求提升软件设计水平。

本书内容
第1章讲解与源代码设计结构有关的基础知识,以及一些能够让代码易于维护、易于阅读的原则。
第2章讲解Java平台这一丰富而强大的工具。该章会详细讲解Java平台的特性、功能和设计,为理解Java设计模式的目标与价值奠定基础。
第3章讲解对象实例化,这是所有应用程序的关键部分。该章介绍了如何在牢记需求的前提下做好对象实例化。
第4章讲解如何编写源代码,以便清楚地表示程序用到的对象之间的关系。
第5章讲解如何编写源代码,让对象可以进行通信和交换信息,同时保持代码透明。
第6章讲解Java平台及其并发环境的本质。理解了这一点,我们就能明白如何利用并发来更好地满足应用程序的需求。
第7章讲解我们在开发应用程序的过程中可能会遇到的反模式。该章将告诉你这些反模式出现的缘由、如何识别反模式,并提出一些消除反模式的办法。

准备工作
为了执行书中的源代码与指令,你需要安装下列工具:
软件/硬件 操作系统
(必须安装)Java Development Kit(JDK)17或更新的版本 Windows、macOS或Linux
(建议安装)IDE(Integrated Development Environment,集成开发环境)VSCode 1.73.1或更新的版本 Windows、macOS或Linux
(必须安装)某种文本编辑器或IDE Windows、macOS或Linux

本书要求安装JDK 17或更新版本。请在操作系统中执行下列命令,以检查系统中是否安装了JDK:
如果用的是Windows系统,那就打开命令提示符(Command Prompt)窗口,并执行java–version命令。
如果用的是Linux或macOS系统,那就在命令提示符(或者终端)界面执行java–version命令。
如果执行结果如下,则说明系统已经安装了JDK:

如果你的计算机还没安装JDK,那就访问https://dev.java/learn/getting-started-with-java/页面,按照其中给出的步骤安装JDK。网页(https://jdk.java.net/archive/)给出了适用于各种操作系统的JDK安装包,你可以从中选择自己想要安装的版本。
请访问https://code.visualstudio.com/download以下载并安装Visual Studio Code(简称VSCode)。
VSCode终端界面的用法参见https://code.visualstudio.com/docs/terminal/
basics。

下载范例代码
书中的范例代码及其更新可以从https://github.com/PacktPublishing/Practical-
Design-Patterns-for-Java-Developers下载。

下载彩色图像
我们还提供了一份PDF文件,书中的截图与彩色图像都能在该文件中找到。它的下载网址是https://packt.link/nSLEf。

排版约定
本书使用了以下排版约定。
代码体:表示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入,以及Twitter账户名。例如, “我们来看看开发Vehicle类的一般流程。”
代码块如下所示:

如果某段代码中有一些内容需要强调,那么相关的行或项会加粗:

命令行界面里的输入与输出如下所示:

粗体:表示新术语、重要词汇或出现在屏幕上的文字(例如,菜单或对话框中的文字就会印刷成粗体)。例如,“字节码运行在Java虚拟机(Java Virtual Machine,JVM)中。”
提示或者重要说明
这些内容放在文本框中。