策略和模板方法都讲算法,但角度不同
策略模式把一组可互换的算法封装起来,运行时可以选择不同策略。折扣规则、支付方式、排序规则、压缩算法这些“可替换规则”,都很像策略模式。
模板方法模式是在父类里定义流程骨架,把某些具体步骤交给子类实现。它关注的是流程顺序稳定、细节不同。看到“步骤固定、子类重写部分步骤”,就要想到模板方法。
| 模式 | 题干信号 | 关键区别 |
|---|---|---|
| 策略模式 | 算法族、可替换、运行时切换、少写 if-else | 整体算法可替换 |
| 模板方法 | 流程骨架、步骤固定、子类实现细节 | 大流程固定,局部步骤变化 |
| 观察者 | 状态变化、自动通知多个对象 | 一对多通知 |
| 工厂方法 | 创建产品对象、由子类决定实例化 | 把创建职责延迟到子类 |
| 单例 | 唯一实例、全局访问点 | 系统中只需要一个对象 |
观察者看通知,不看对象数量
观察者模式的题眼不是“有很多对象”,而是“一个对象状态变化后,自动通知多个依赖对象”。比如订阅、事件、消息通知、状态更新,都是观察者的常见语言。
不要把观察者和享元混。享元强调共享大量细粒度对象以节省内存;观察者强调通知和依赖关系。
工厂方法和单例都是创建型,但问题完全不同
工厂方法解决“由谁来创建具体产品”的问题,重点是把创建对象的职责从使用者那里分离出去,并让子类决定实例化哪一种产品。
单例解决“系统中只应该有一个实例”的问题,常见于配置、日志、连接管理等场景。看到唯一实例、全局访问点,才考虑单例。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- 策略模式适合解决什么设计问题?设计模式 / 策略模式
- 模板方法模式适合解决什么问题?设计模式 / 模板方法模式
- 观察者模式适合解决什么问题?观察者模式 / 观察者模式适用场景
- 工厂方法模式解决什么问题?工厂方法模式 / 软件设计师设计模式
- 单例模式适用于什么场景?单例模式 / 面向对象