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

简单工厂模式和策略模式的区别

下面从概念、设计思想、适用场景、代码结构几个方面详细讲解简单工厂模式策略模式的区别,并用Java 示例说明。


一、简单工厂模式(Simple Factory)

1 设计思想

简单工厂模式的核心思想是:

将对象的创建过程集中到一个工厂类中,由工厂决定创建哪一个具体对象。

调用方不需要知道具体类,只需要告诉工厂需要什么类型。

简单理解:

调用者 -> 工厂 -> 具体对象

工厂负责:

  • 判断类型

  • 创建对象

  • 返回对象

调用者只负责使用对象。


2 示例场景

假设有一个计算器系统

支持:

  • 加法

  • 减法

  • 乘法

  • 除法

如果不用设计模式:

if(type.equals("add")){ AddOperation op = new AddOperation(); }

代码会充满if else

简单工厂就是把这些逻辑统一放到工厂里。


3 Java 示例

第一步:定义运算接口

public interface Operation { double calculate(double a, double b); }

第二步:实现具体运算类

加法

public class AddOperation implements Operation { @Override public double calculate(double a, double b) { return a + b; } }

减法

public class SubOperation implements Operation { @Override public double calculate(double a, double b) { return a - b; } }

第三步:创建工厂类

public class OperationFactory { public static Operation createOperation(String type) { if ("add".equals(type)) { return new AddOperation(); } if ("sub".equals(type)) { return new SubOperation(); } throw new RuntimeException("unsupported operation"); } }

第四步:客户端调用

public class Client { public static void main(String[] args) { Operation operation = OperationFactory.createOperation("add"); double result = operation.calculate(10, 5); System.out.println(result); } }

4 简单工厂特点

优点:

  1. 客户端不需要知道具体类

  2. 对象创建统一管理

  3. 代码更清晰

缺点:

最大的问题是:

违反开闭原则

如果增加新的操作:

乘法 除法

必须修改:

OperationFactory

二、策略模式(Strategy Pattern)

1 设计思想

策略模式的核心思想:

定义一系列算法,将每一个算法封装起来,并且可以互相替换。

策略模式的结构:

Context(上下文) Strategy(策略接口) ConcreteStrategy(具体策略)

简单理解:

行为可以随时切换

例如:

  • 支付方式

  • 排序算法

  • 压缩算法

  • 促销算法


2 示例场景

还是用计算器例子,但用策略模式。

不同计算方式就是不同策略。


3 Java 示例

第一步:定义策略接口

public interface Strategy { double calculate(double a, double b); }

第二步:实现具体策略

加法策略

public class AddStrategy implements Strategy { @Override public double calculate(double a, double b) { return a + b; } }

减法策略

public class SubStrategy implements Strategy { @Override public double calculate(double a, double b) { return a - b; } }

第三步:定义上下文类

public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public double execute(double a, double b) { return strategy.calculate(a, b); } }

第四步:客户端调用

public class Client { public static void main(String[] args) { Strategy strategy = new AddStrategy(); Context context = new Context(strategy); double result = context.execute(10, 5); System.out.println(result); } }

如果要切换策略:

Strategy strategy = new SubStrategy();

不需要修改其他代码。


三、两种模式核心区别

对比点简单工厂模式策略模式
核心目的创建对象切换算法
关注点对象创建行为变化
是否有工厂没有
是否支持动态切换不支持支持
是否符合开闭原则一般不符合符合
使用方式工厂决定对象客户端选择策略

四、代码结构对比

简单工厂

结构

Operation ↑ AddOperation SubOperation OperationFactory

客户端

OperationFactory.create("add")

策略模式

结构

Strategy ↑ AddStrategy SubStrategy Context

客户端

new Context(new AddStrategy())

五、什么时候用简单工厂

适用于:

  1. 对象创建逻辑复杂

  2. 对象种类不多

  3. 不需要经常新增类型

例如:

  • 日志对象创建

  • 数据库连接创建

  • 简单工具类


六、什么时候用策略模式

适用于:

  1. 多种算法可互换

  2. 算法经常增加

  3. 希望运行时切换行为

例如:

  • 支付方式

  • 排序算法

  • 折扣计算

  • 路径规划


七、通俗总结

用一句话理解:

简单工厂

解决“创建哪个对象”的问题

例子:

你去餐厅点餐 服务员帮你决定厨师

策略模式

解决“使用哪种算法”的问题

例子:

你自己选择: 清蒸 红烧 油炸

再简单一点:

模式本质
简单工厂帮你创建对象
策略模式让你切换算法

如果你愿意,我可以再给你讲一个真实业务中常见的例子(支付系统),能一下子彻底理解策略模式为什么比简单工厂更高级

http://www.jsqmd.com/news/487145/

相关文章:

  • YOLO11 改进 - 主干网络_ RepViT重访移动端CNN的ViT视角:轻量级设计分离Token与Channel混合器,优化移动端实时检测
  • python 生成与安装 inquirement
  • 探索MATLAB下综合能源系统优化调度:阶梯式碳与供需灵活双响应的奇妙之旅
  • 轻松掌握C语言中的大小写字母转换
  • YOLO11 改进 - 主干网络_ SwinTransformer 移位窗口层次化视觉变换器:层次化特征提取增强多尺度目标感知,优化复杂场景检测
  • 新手也能上手!备受喜爱的降AI率工具 —— 千笔·降AI率助手
  • 【Azure Key Vault】下载Key Vault中保存证书的PFX文件报错问题分析
  • 空间栅格化(体素化)及射线选择原理
  • 【2026年最新600套毕设项目分享】springboot房屋交易系统(14149)
  • **发散创新:基于Python的脉冲神经网络模拟与实时计算优化实践**
  • 爱心捐赠系统,公益捐赠系统, 基于SpringBoot3+vue3的原创精品,适用于毕业设计、实习项目、学习项目
  • YOLO11 改进 - 主干网络_ FasterNet (基于PConv部分卷积的神经网络):轻量级设计优化内存访问效率,实现精度与速度双重提升
  • YOLOv11涨点改进| CVPR2026 |全网创新首发、Conv卷积改进篇 | 引入MSInit轻量级多尺度卷积,捕获局部细节和结构纹理信息,助力YOLOv11目标检测,图像分割,图像分类高效涨点
  • # 虚拟世界中的编程艺术:用 Rust构建轻量级 3D 场景引擎 在虚拟世界的浪潮中,**开发
  • 前端如何渲染 Markdown 格式:从基础到实战全指南
  • 快捷键及Dos命令
  • YOLO11 改进 - 主干网络_ MobileNetV4 移动网络第四版:通用倒瓶颈与移动注意力协同优化硬件效率,提升移动端检测适应性
  • H6光伏逆变器仿真模型:与量产程序一致的代码控制探索
  • YOLO11 改进 - 主干网络_ LSKNet大型选择性核网络:大核深度卷积与空间选择机制协同动态调整感受野,增强旋转目标检测
  • 大数据与会计专业必考证书有哪些?
  • 如何基于页面设计测试点(测试实习经验总结)
  • YOLO11 改进 - 主干网络_ EfficientRep:一种旨在提高硬件效率的RepVGG风格卷积神经网络架构
  • 飞桨动态图超流畅
  • 财务BP
  • 基于微信小程序的竞赛报名系统_13348
  • 青龙面板密码和账户错误重置
  • 基于 MATLAB 的改进带记忆模拟退火算法求解 TSP 问题
  • DeepSeek-V3发布:性能超越,成本仅为Llama 3的七分之一
  • WPS办公技巧:多工作表自动汇总与拆分
  • 金刚石切割片选购指南:从科创研磨看国产刀具的技术突围