软件设计师 · 设计模式 · 行为型与创建型

策略、模板方法、观察者、工厂方法、单例怎么区分?

这几个模式常被放在同一套选择题里互相干扰。策略和模板方法都和算法有关,但一个强调算法可替换,一个强调流程骨架固定;工厂方法和单例都和对象创建有关,但一个解决创建哪种产品,一个保证只有一个实例。

软件设计师专题 软考题库编辑部 持续更新

策略和模板方法都讲算法,但角度不同

策略模式把一组可互换的算法封装起来,运行时可以选择不同策略。折扣规则、支付方式、排序规则、压缩算法这些“可替换规则”,都很像策略模式。

模板方法模式是在父类里定义流程骨架,把某些具体步骤交给子类实现。它关注的是流程顺序稳定、细节不同。看到“步骤固定、子类重写部分步骤”,就要想到模板方法。

模式题干信号关键区别
策略模式算法族、可替换、运行时切换、少写 if-else整体算法可替换
模板方法流程骨架、步骤固定、子类实现细节大流程固定,局部步骤变化
观察者状态变化、自动通知多个对象一对多通知
工厂方法创建产品对象、由子类决定实例化把创建职责延迟到子类
单例唯一实例、全局访问点系统中只需要一个对象

观察者看通知,不看对象数量

观察者模式的题眼不是“有很多对象”,而是“一个对象状态变化后,自动通知多个依赖对象”。比如订阅、事件、消息通知、状态更新,都是观察者的常见语言。

不要把观察者和享元混。享元强调共享大量细粒度对象以节省内存;观察者强调通知和依赖关系。

工厂方法和单例都是创建型,但问题完全不同

工厂方法解决“由谁来创建具体产品”的问题,重点是把创建对象的职责从使用者那里分离出去,并让子类决定实例化哪一种产品。

单例解决“系统中只应该有一个实例”的问题,常见于配置、日志、连接管理等场景。看到唯一实例、全局访问点,才考虑单例。

相关题目解析

下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。