跳转至

示例代码

结合模式笔记阅读示例,先观察对象之间的职责,再运行代码验证实际调用过程。

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 附录场景;教学建模

工厂方法与抽象工厂:披萨示例

从本仓库根目录运行:

1
2
3
4
build_dir="$(mktemp -d)"
javac -encoding UTF-8 -d "$build_dir" \
  docs/design-patterns/source/abstract-factory/AbstractFactoryPizzaDemo.java
java -cp "$build_dir" AbstractFactoryPizzaDemo

下载单个 Java 文件后,也可以在文件所在目录执行 javac AbstractFactoryPizzaDemo.java 和 java AbstractFactoryPizzaDemo。

示例会分别订购纽约和芝加哥的奶酪、蛤蜊披萨。观察同一个 CheesePizza 或 ClamPizza 类如何通过不同原料工厂获得以下组合:

店铺与口味 面团 酱汁 奶酪 蛤蜊
纽约奶酪 薄面团 Marinara Reggiano 不使用
纽约蛤蜊 薄面团 Marinara Reggiano 新鲜蛤蜊
芝加哥奶酪 厚面团 Plum Tomato Mozzarella 不使用
芝加哥蛤蜊 厚面团 Plum Tomato Mozzarella 冷冻蛤蜊

这是依据原书结构编写的简化教学版本:仅支持 cheese、clam 两种口味;原料类只保留展示信息;辅助类型放在同一文件中,方便独立编译。不支持的口味会明确抛出异常。抽象工厂仍保留原书的六类原料创建方法。

历史阅读片段

这两个文件保留原始读书记录,包含同名类型,且 Pizza.java 中的 public 类名与文件名不一致,不能直接作为一组 Java 源文件编译。需要运行完整例子时,使用上面的独立示例。

类图源文件

图示直接写在对应文章的 Mermaid 代码块中:类图使用 classDiagram,状态图使用 stateDiagram-v2。编辑文章即可更新图示,无需另外维护图片和 PlantUML 文件。

评论