多态是面向对象编程的核心特性,支撑简单工厂(创建阶段)和模板方法(执行阶段)实现解耦与扩展:前者通过抽象类型返回实例,后者借抽象/钩子方法动态绑定子类逻辑,二者常结合使用。

多态是面向对象编程的核心特性之一,它让同一接口可以有多种实现,在设计模式中起到“解耦”和“可扩展”的关键作用。简单工厂和模板方法模式虽目的不同,但都依赖多态来实现行为的灵活替换与统一调度。
简单工厂中的多态:通过父类/接口引用屏蔽具体实现
简单工厂本身不是 GoF 23 种设计模式之一,但它常作为创建对象的入口,其价值正体现在对多态的运用上。
- 工厂方法返回的是抽象类型(如接口或基类),而非具体子类实例;调用方只依赖这个抽象类型操作对象,不关心实际是哪个子类。
- 新增产品类时,只需添加新子类 + 在工厂内部增加分支逻辑,原有使用方代码完全不用修改——这正是多态支撑的“开闭原则”体现。
- 例如定义 Shape 接口,有 Circle、Rectangle 实现;工厂根据参数返回对应实例,使用者调用 draw() 时,JVM/CLR 自动绑定到实际类型的实现,这就是运行时多态。
模板方法中的多态:钩子方法与抽象方法驱动子类差异化实现
模板方法模式定义一个算法骨架,将某些步骤延迟到子类中实现。它的多态性主要体现在“抽象方法”和“钩子方法”的动态分派上。
- 模板方法(通常是 final)在父类中编写流程,其中调用的 abstract 方法或可重写的 hook 方法,实际执行的是子类提供的版本。
- 客户端仅持有父类引用,调用模板方法即可触发一整套由子类定制的行为组合——算法结构不变,细节由多态动态填充。
- 比如 AbstractGame 定义 play() 模板:初始化 → 开始 → 运行 → 结束;其中 start() 和 end() 是 abstract 方法,onPause() 是 hook,默认空实现;各游戏子类按需重写,运行时自动调用对应实现。
两者的多态侧重点不同但协同性强
简单工厂侧重“对象创建阶段”的多态,解决“生成谁”的问题;模板方法侧重“行为执行阶段”的多态,解决“怎么运行”的问题。二者常结合使用:
- 用简单工厂生产某个模板方法的子类实例;
- 客户端拿到父类引用后,直接调用模板方法,内部自动激活子类的具体逻辑;
- 这样既隐藏了对象创建细节,又统一了执行流程,还支持无限扩展新策略——多态贯穿始终。
不复杂但容易忽略:没有多态,简单工厂只能返回具体类型导致调用方紧耦合;没有多态,模板方法就退化为一堆重复代码,失去复用意义。真正让模式“活起来”的,正是多态带来的动态绑定能力。















