当前位置: 首页 > news >正文

策略模式 vs. 工厂模式:对比与分析

相同点
  1. 解耦思想

    • 两者都通过接口/抽象类将实现与调用方解耦,降低模块间的直接依赖。

  2. 符合开闭原则

    • 新增策略或产品时,只需扩展新类,无需修改已有代码。

  3. 封装变化

    • 策略模式封装算法的变化,工厂模式封装对象创建的变化


不同点
维度策略模式工厂模式
类型行为型设计模式(关注做什么创建型设计模式(关注如何创建
核心目标动态选择算法/行为统一创建对象,隐藏实例化细节
运行时行为允许在运行时切换策略(如支付方式)通常在创建时确定对象类型(如生成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
    }
}

关键区别总结

  1. 目的不同

    • 策略模式:解决行为的灵活切换问题(如不同支付逻辑)。

    • 工厂模式:解决对象创建的复杂性问题(如不同支付对象的初始化)。

  2. 交互时机

    • 策略模式:客户端通过上下文类主动切换策略(如 setStrategy())。

    • 工厂模式:客户端通过工厂类被动获取对象(如 createStrategy())。

  3. 适用阶段

    • 策略模式:在对象已存在时,动态改变其行为。

    • 工厂模式:在对象创建时决定其类型。


结合使用场景

在实际开发中,策略模式常与工厂模式结合

  1. 用工厂模式创建策略对象(隐藏创建细节)。

  2. 用策略模式管理策略的切换(动态修改行为)。

例如:电商系统中,通过工厂生成不同的促销策略(满减、折扣),再通过策略模式动态切换。

相关文章:

  • 15:视图
  • T113-i开发板的休眠与RTC定时唤醒指南
  • git | 回退版本 并保存当前修改到stash,在进行整合。[git checkout | git stash 等方法 ]
  • 【安全运营】安全运营关于告警降噪的一些梳理
  • NO.55十六届蓝桥杯备战|排序|插入|选择|冒泡|堆|快速|归并(C++)
  • Linux-数据结构-双向链表与栈
  • Linux进程间通信方式
  • TypeScript教程
  • python爬虫可能遇到的小bug
  • 【RK3588嵌入式图形编程】-SDL2-渲染文本
  • CSS 文档流:元素排列的底层逻辑与布局控制
  • stm32-ADC
  • 明远智睿SD2351核心板:多接口融合,破解边缘计算难题
  • 关于强化学习小记
  • 玩转 SpringCloud - 快速构建分布式系统详解
  • 第十六届蓝桥杯康复训练--5
  • 排列与二进制
  • 力扣刷题记录-二叉树展开为链表
  • 【2025】基于springboot+vue的教务/课程/成绩管理系统设计与实现(源码、万字文档、图文修改、调试答疑)
  • Agent Team 多智能体系统解析
  • 富家罹盗与财富迷思:《西游记》与《蜃楼志》中的强盗案
  • 王毅同巴基斯坦副总理兼外长达尔通电话
  • 面对非专业人士,科学家该如何提供建议
  • 匈牙利外长称匈方已驱逐两名乌克兰外交官
  • 山东14家城商行中,仅剩枣庄银行年营业收入不足10亿
  • 江西暴雨强对流明显,专家:落雨区高度重叠,地质灾害风险高