如何在策略模式(Strategy Pattern)与工厂模式(Factory Pattern)间选型?
策略模式(Strategy Pattern)与工厂模式(Factory Pattern)选型指南
核心定位差异
先明确两者的本质目标,这是选型的基础:
- 工厂模式:属于创建型模式,核心是封装对象的创建逻辑。它解决的是「如何高效、解耦地生成对象」的问题,让调用方无需关注具体类的实例化细节(比如依赖参数、初始化步骤),只需要通过工厂入口获取对象。
- 策略模式:属于行为型模式,核心是封装可变的算法/行为。它解决的是「如何在运行时灵活切换业务规则」的问题,让同一业务入口能适配多种不同的处理逻辑,同时避免冗余的条件分支。
实用场景与选型判断
优先选择工厂模式的场景
- 对象创建逻辑复杂:当实例化一个类需要多步初始化(比如读取配置、依赖其他对象、资源申请),把这些逻辑封装到工厂中,调用方只需传入简单参数即可拿到可用对象。
例:创建云存储客户端,不同厂商(阿里云、腾讯云)的客户端初始化需要不同的密钥、端点配置,工厂统一处理这些细节,调用方仅需指定厂商类型。 - 需要隐藏具体实现:不想让上层模块知道底层的具体类,仅暴露接口,降低模块间耦合。
例:日志组件,调用方只依赖Logger接口,工厂根据配置自动创建FileLogger或ConsoleLogger,上层无需感知具体实现类。 - 集中管理对象生命周期:需要统一控制对象的创建规则(比如单例、对象池复用),工厂作为唯一入口,避免重复代码。
例:数据库连接池,工厂负责维护连接的创建、复用、销毁逻辑,确保连接资源的合理利用。
优先选择策略模式的场景
- 同一业务存在多种可变规则:业务流程框架固定,但具体执行逻辑有多种变体,需要在运行时选择。
例:电商的折扣计算,会员用户、普通用户、新用户有不同的折扣规则,将每种规则封装为策略类,根据用户类型动态调用对应策略。 - 需要动态切换行为:根据运行时的上下文(比如数据规模、用户操作)切换不同的处理逻辑。
例:图片压缩,根据图片大小自动选择不同的压缩算法(小图用无损压缩,大图用有损压缩)。 - 消除大量条件分支:当代码中出现大量
if-else或switch-case判断不同业务逻辑时,用策略模式重构,将每个分支封装为独立策略类,提升代码可维护性。
例:支付流程,原来的代码通过if(支付类型 == 微信) {...} else if(支付类型 == 支付宝) {...}处理,改用策略模式后,新增支付方式只需添加新策略类,无需修改原有逻辑。
组合使用的场景
两者并非互斥,很多场景下可以结合使用:用工厂模式封装策略对象的创建逻辑,再用策略模式实现行为的动态切换。
例:支付场景中,工厂根据用户选择的支付类型创建对应的WeChatPayStrategy或AlipayStrategy,然后由上下文类调用策略的pay()方法完成支付。既隐藏了策略对象的创建细节,又实现了支付逻辑的灵活切换。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

