示例代码¶
结合模式笔记阅读示例,先观察对象之间的职责,再运行代码验证实际调用过程。
Head First 示例索引¶
每篇模式笔记都提供具体场景、角色映射、示例 UML 和协作过程,可以和同页的通用类结构对照阅读。
有配套代码的 18 篇示例依据作者仓库的 2020 年第二版说明,链接固定到同一提交。责任链、解释器、中介者、备忘录、访问者的 UML 根据原书附录场景整理为教学模型,类名、方法和关系的简化会在对应页说明;这五篇通过原书公开预览引用场景依据。原有笔记中的 2014 年版本引用继续保留。
| 分类 | 模式与示例 | 对应材料 |
|---|---|---|
| 创建型 | 工厂方法:地区披萨店 · UML | 第 4 章;配套源码 |
| 创建型 | 抽象工厂:地区原料产品族 · UML | 第 4 章;配套源码 |
| 创建型 | 建造者:度假行程规划 · UML | 附录模式;配套源码 |
| 创建型 | 原型:复制怪物 · UML | 附录模式;配套源码 |
| 创建型 | 单例:巧克力锅炉 · UML | 第 5 章;配套源码 |
| 结构型 | 装饰者:星巴兹咖啡与调料 · UML | 第 3 章;配套源码 |
| 结构型 | 适配器:火鸡适配鸭子接口 · UML | 第 7 章;配套源码 |
| 结构型 | 桥接:遥控器与不同品牌电视 · UML | 附录模式;配套源码 |
| 结构型 | 组合:菜单与子菜单树 · UML | 第 9 章;配套源码 |
| 结构型 | 外观:家庭影院 · UML | 第 7 章;配套源码 |
| 结构型 | 享元:共享树木对象 · UML | 附录模式;配套源码 |
| 结构型 | 代理:远程糖果机监控 · UML | 第 11 章;配套源码 |
| 行为型 | 策略:模拟鸭子的可替换行为 · UML | 第 1 章;配套源码 |
| 行为型 | 命令:可撤销遥控器 · UML | 第 6 章;配套源码 |
| 行为型 | 模板方法:咖啡、茶与调料钩子 · UML | 第 8 章;配套源码 |
| 行为型 | 状态:带赢家奖励的糖果机 · UML | 第 10 章;配套源码 |
| 行为型 | 责任链:邮件分类处理 · UML | 附录场景;教学建模 |
| 行为型 | 解释器:控制鸭子的简单语言 · UML | 附录场景;教学建模 |
| 行为型 | 迭代器:合并早餐与午餐菜单 · UML | 第 9 章;配套源码 |
| 行为型 | 中介者:智能家居设备协作 · UML | 附录场景;教学建模 |
| 行为型 | 备忘录:冒险游戏存档与恢复 · UML | 附录场景;教学建模 |
| 行为型 | 观察者:气象站与布告板 · UML | 第 2 章;配套源码 |
| 行为型 | 访问者:菜单营养信息分析 · UML | 附录场景;教学建模 |
工厂方法与抽象工厂:披萨示例¶
- 源文件:AbstractFactoryPizzaDemo.java。
- 对应笔记:工厂方法、抽象工厂。
- 运行要求:JDK 8 或更高版本,无第三方依赖。
从本仓库根目录运行:
下载单个 Java 文件后,也可以在文件所在目录执行 javac AbstractFactoryPizzaDemo.java 和 java AbstractFactoryPizzaDemo。
示例会分别订购纽约和芝加哥的奶酪、蛤蜊披萨。观察同一个 CheesePizza 或 ClamPizza 类如何通过不同原料工厂获得以下组合:
| 店铺与口味 | 面团 | 酱汁 | 奶酪 | 蛤蜊 |
|---|---|---|---|---|
| 纽约奶酪 | 薄面团 | Marinara | Reggiano | 不使用 |
| 纽约蛤蜊 | 薄面团 | Marinara | Reggiano | 新鲜蛤蜊 |
| 芝加哥奶酪 | 厚面团 | Plum Tomato | Mozzarella | 不使用 |
| 芝加哥蛤蜊 | 厚面团 | Plum Tomato | Mozzarella | 冷冻蛤蜊 |
这是依据原书结构编写的简化教学版本:仅支持 cheese、clam 两种口味;原料类只保留展示信息;辅助类型放在同一文件中,方便独立编译。不支持的口味会明确抛出异常。抽象工厂仍保留原书的六类原料创建方法。
历史阅读片段¶
- Pizza.java:把创建分支写在订购流程中的阶段。
- PizzaStore.java:引入简单工厂的阶段。
这两个文件保留原始读书记录,包含同名类型,且 Pizza.java 中的 public 类名与文件名不一致,不能直接作为一组 Java 源文件编译。需要运行完整例子时,使用上面的独立示例。
类图源文件¶
图示直接写在对应文章的 Mermaid 代码块中:类图使用 classDiagram,状态图使用 stateDiagram-v2。编辑文章即可更新图示,无需另外维护图片和 PlantUML 文件。