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

工厂模式 + 模板方法模式 + 策略模式的适用场景

这三种设计模式可以结合使用,适用于以下场景:

  1. 固定流程 + 动态步骤实现
    当系统有一个固定的处理流程(模板方法模式),但某些步骤的具体实现需要动态切换(策略模式),且这些步骤的实现对象需要通过工厂来创建(工厂模式)。

  2. 多维度变化场景

    • 流程的整体骨架固定(模板方法模式)。
    • 流程中的某些步骤存在多种实现方式(策略模式)。
    • 步骤的具体实现需要根据参数动态创建(工厂模式)。
  3. 常见案例

    • 数据导出(固定流程:准备数据 → 生成文件 → 保存文件,文件格式由策略决定)。
    • 支付系统(固定流程:验签 → 扣款 → 通知,支付方式由策略决定)。
    • 游戏技能释放(固定流程:检测目标 → 计算伤害 → 播放动画,伤害计算逻辑由策略决定)。

Java 代码案例:数据导出系统

1. 策略模式:定义文件生成策略
// 文件生成策略接口
interface ExportStrategy {void generateFile(String data);
}// CSV 生成策略
class CsvExportStrategy implements ExportStrategy {@Overridepublic void generateFile(String data) {System.out.println("生成 CSV 文件: " + data);}
}// Excel 生成策略
class ExcelExportStrategy implements ExportStrategy {@Overridepublic void generateFile(String data) {System.out.println("生成 Excel 文件: " + data);}
}
2. 工厂模式:创建策略对象
class ExportStrategyFactory {public static ExportStrategy getStrategy(String type) {if ("csv".equalsIgnoreCase(type)) {return new CsvExportStrategy();} else if ("excel".equalsIgnoreCase(type)) {return new ExcelExportStrategy();}throw new IllegalArgumentException("不支持的格式: " + type);}
}
3. 模板方法模式:定义导出流程
abstract class DataExporter {private ExportStrategy strategy;public DataExporter(ExportStrategy strategy) {this.strategy = strategy;}// 模板方法:定义固定流程public final void export() {String data = prepareData();strategy.generateFile(data);saveFile();}// 抽象方法:由子类实现数据准备逻辑protected abstract String prepareData();// 固定步骤:保存文件private void saveFile() {System.out.println("保存文件到服务器");}
}// 具体子类:销售数据导出
class SalesDataExporter extends DataExporter {public SalesDataExporter(ExportStrategy strategy) {super(strategy);}@Overrideprotected String prepareData() {System.out.println("准备销售数据...");return "销售数据,2023,100000";}
}
4. 客户端调用
public class Client {public static void main(String[] args) {// 用户选择导出类型String exportType = "csv";// 工厂创建策略对象ExportStrategy strategy = ExportStrategyFactory.getStrategy(exportType);// 模板方法执行固定流程(策略对象注入)DataExporter exporter = new SalesDataExporter(strategy);exporter.export();}
}
输出结果
准备销售数据...
生成 CSV 文件: 销售数据,2023,100000
保存文件到服务器

模式协作关系

  1. 工厂模式:封装策略对象的创建过程,客户端无需关心具体实现类。
  2. 模板方法模式:固定导出流程的骨架(准备数据 → 生成文件 → 保存)。
  3. 策略模式:将文件生成逻辑解耦,支持动态切换 CSV/Excel 等格式。

这种组合模式提高了代码的可扩展性和可维护性,新增文件格式只需添加新的策略类,无需修改流程代码。

其他案例:数据库连接
抽象工厂模式:创建不同数据库类型的执行器(传入type得到连接器)
模板方法模式:封装JDBC操作通用流程
策略模式:不同数据库差异化实现(如excel读取)

http://www.lqws.cn/news/164071.html

相关文章:

  • 在 Spring Boot 中使用 JSP
  • 如何做好一份技术文档?(下篇)
  • Ansys Maxwell:线圈和磁体的静磁 3D 分析
  • 每日算法 -【Swift 算法】三数之和最接近目标值
  • 高敏感应用如何保护自身不被逆向?iOS 安全加固策略与工具组合实战(含 Ipa Guard 等)
  • wxpython快捷键示例
  • SpringBoot3整合MySQL8的注意事项
  • 云服务器自带的防御可靠吗
  • 使用 minicom 录制串口报文并回放
  • 数据融合是什么?进行数据融合的4大关键环节!
  • AI开启光伏新时代:精准计算每小时发电量​
  • 【JS进阶】ES5 实现继承的几种方式
  • 微软认证考试科目众多?该如何选择?
  • 基于SpringBoot的房屋租赁系统的设计与实现(thymeleaf+MySQL)
  • IDEA202403 设置主题和护眼色
  • 【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)
  • C# 委托UI控件更新例子,何时需要使用委托
  • Agentic AI 和 Agent AI 到底区别在哪里?
  • Redis大量key集中过期怎么办
  • Qt 开发中的父类与父对象的区别和父对象传递:如何选择 `QWidget` 或 `QObject`?
  • 基于Canvas实现画布
  • Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
  • 西门子SCL之IF-ELSIF语句详解及应用(安全控制代码)
  • 【计组】真题 2015 大题
  • Vue---vue使用AOS(滚动动画)库
  • 分布式光纤传感(DAS)技术应用解析:从原理到落地场景
  • 【QT】使用QT帮助手册找控件样式
  • 基于责任链模式进行订单参数的校验
  • 自动化办公集成工具:一站式解决文档处理难题
  • React Router 中 navigate 后浏览器返回按钮不起作用的问题记录