工厂模式 + 模板方法模式 + 策略模式的适用场景
这三种设计模式可以结合使用,适用于以下场景:
-
固定流程 + 动态步骤实现:
当系统有一个固定的处理流程(模板方法模式),但某些步骤的具体实现需要动态切换(策略模式),且这些步骤的实现对象需要通过工厂来创建(工厂模式)。 -
多维度变化场景:
- 流程的整体骨架固定(模板方法模式)。
- 流程中的某些步骤存在多种实现方式(策略模式)。
- 步骤的具体实现需要根据参数动态创建(工厂模式)。
-
常见案例:
- 数据导出(固定流程:准备数据 → 生成文件 → 保存文件,文件格式由策略决定)。
- 支付系统(固定流程:验签 → 扣款 → 通知,支付方式由策略决定)。
- 游戏技能释放(固定流程:检测目标 → 计算伤害 → 播放动画,伤害计算逻辑由策略决定)。
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
保存文件到服务器
模式协作关系
- 工厂模式:封装策略对象的创建过程,客户端无需关心具体实现类。
- 模板方法模式:固定导出流程的骨架(准备数据 → 生成文件 → 保存)。
- 策略模式:将文件生成逻辑解耦,支持动态切换 CSV/Excel 等格式。
这种组合模式提高了代码的可扩展性和可维护性,新增文件格式只需添加新的策略类,无需修改流程代码。
其他案例:数据库连接
抽象工厂模式:创建不同数据库类型的执行器(传入type得到连接器)
模板方法模式:封装JDBC操作通用流程
策略模式:不同数据库差异化实现(如excel读取)