知识卡片

工厂方法模式修复策略模式暴露具体策略类的缺陷

普通读书笔记卡 · 1853.a.9

内容

IC卡扣款系统案例揭示策略模式的缺陷:要求高层模块初始化Context时直接new具体 策略类,违反迪米特法则——高层不该依赖具体策略类名。解法是引入工厂方法模式:用枚举类 把”策略标识”与”实现类全限定名”映射登记,高层只传枚举值给工厂,工厂内部反射产生对象。 发散:这是”策略+工厂方法”组合的核心动机——工厂方法专门堵上策略模式暴露具体类型这个 耦合口子。

参考来源

- 位置:《设计模式之禅(第2版)》第35章《工厂方法模式+策略模式》35.1节(源文件:_epub-src/text/part0153.html) - 结论依据:原文指出"策略模式是有缺陷的……它的具体策略必须暴露出去,而且还要由上层模块初始化,这不合适,与迪米特法则有冲突……正好工厂方法模式可以帮我们产生指定的对象……引入一个配置文件进行映射,避免系统僵化情况的发生,我们以枚举类完成该任务",并配以`StrategyMan`枚举+`StrategyFactory`反射产生对象的完整实现。 - 原始内容:策略模式是有缺陷的……它的具体策略必须暴露出去,而且还要由上层模块初始化,这不合适,与迪米特法则有冲突,高层次模块对低层次的模块应该仅仅处在"接触"的层次上,而不应该是"耦合"的关系……正好工厂方法模式可以帮我们产生指定的对象……我们以枚举类完成该任务……一个简单的工厂,根据策略管理类的枚举项创建一个策略对象,简单而实用,策略模式的缺陷也弥补成功。