相同点
-
解耦思想
- 两者都通过接口/抽象类将实现与调用方解耦,降低模块间的直接依赖。
-
符合开闭原则
- 新增策略或产品时,只需扩展新类,无需修改已有代码。
-
封装变化
- 策略模式封装算法的变化 ,工厂模式封装对象创建的变化。
不同点
维度 | 策略模式 | 工厂模式 |
---|---|---|
类型 | 行为型设计模式(关注做什么) | 创建型设计模式(关注如何创建) |
核心目标 | 动态选择算法/行为 | 统一创建对象,隐藏实例化细节 |
运行时行为 | 允许在运行时切换策略(如支付方式) | 通常在创建时确定对象类型(如生成Logger) |
客户端依赖 | 客户端直接依赖策略接口 | 客户端依赖工厂类和产品接口 |
典型场景 | 支付方式、排序算法、数据解析策略 | 数据库连接、日志工具、UI组件生成 |
代码示例对比
场景:支付系统(策略模式 + 工厂模式结合)
java
复制
// ---------------------- 策略模式部分 ----------------------
interface PaymentStrategy {
void pay(double amount);
}
class AlipayStrategy implements PaymentStrategy {
public void pay(double amount) {
System.out.println("支付宝支付: " + amount);
}
}
class WechatPayStrategy implements PaymentStrategy {
public void pay(double amount) {
System.out.println("微信支付: " + amount);
}
}
// ---------------------- 工厂模式部分 ----------------------
class PaymentStrategyFactory {
public static PaymentStrategy createStrategy(String type) {
switch (type.toLowerCase()) {
case "alipay": return new AlipayStrategy();
case "wechat": return new WechatPayStrategy();
default: throw new IllegalArgumentException("不支持的支付类型");
}
}
}
// ---------------------- 上下文类(策略模式) ----------------------
class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(double amount) {
strategy.pay(amount);
}
}
// ---------------------- 客户端使用 ----------------------
public class Client {
public static void main(String[] args) {
// 工厂模式创建策略对象
PaymentStrategy alipay = PaymentStrategyFactory.createStrategy("alipay");
PaymentContext context = new PaymentContext(alipay);
// 策略模式动态执行支付
context.executePayment(100.0); // 输出: 支付宝支付: 100.0
}
}
关键区别总结
-
目的不同
-
策略模式:解决行为的灵活切换问题(如不同支付逻辑)。
-
工厂模式:解决对象创建的复杂性问题(如不同支付对象的初始化)。
-
-
交互时机
-
策略模式:客户端通过上下文类主动切换策略 (如
setStrategy()
)。 -
工厂模式:客户端通过工厂类被动获取对象 (如
createStrategy()
)。
-
-
适用阶段
-
策略模式:在对象已存在时,动态改变其行为。
-
工厂模式:在对象创建时决定其类型。
-
结合使用场景
在实际开发中,策略模式常与工厂模式结合:
-
用工厂模式创建策略对象(隐藏创建细节)。
-
用策略模式管理策略的切换(动态修改行为)。
例如:电商系统中,通过工厂生成不同的促销策略(满减、折扣),再通过策略模式动态切换。