多态加策略工厂的核心是分离“该选谁”与“怎么干”。通过统一接口抽象共性行为(如export、process),各实现类专注自身逻辑;工厂用Map管理实例,按类型字符串获取对象;配合sealed class或枚举提升类型安全与可维护性。

多态加策略工厂不是为了炫技,而是把“该选谁”和“怎么干”彻底分开。业务代码只管说“我要处理这个类型”,具体怎么处理、用哪个类,由工厂和接口自动决定。
先抽一个统一接口,定义“能做什么”
所有 if-else 分支背后,其实都在做同一件事:比如“导出文件”“发起支付”“计算折扣”。把这些共性动作抽象成接口方法:
-
DocumentExporter 接口含
export(Data data)、validate() -
PaymentProcessor 接口含
process(Order order)、verifyCallback(String raw) - 接口里不出现
if (type.equals("xxx")),也不暴露任何类型字段
每个分支变成一个独立类,各干各的
微信支付、支付宝、PDF 导出、Excel 导出……各自实现接口,互不干扰:
-
WechatProcessor实现支付签名、回调验签、异步通知重试逻辑 -
PdfExporter负责模板渲染、字体嵌入、页眉页脚生成 - 新增渠道?只写一个新类,不碰老代码,也不改调用方
用工厂或策略容器接管“选人”这件事
别再让业务层写 if ("pdf".equals(type)),把判断逻辑收进工厂:
- 初始化时用
Map注册:exporters.put("pdf", new PdfExporter()) - 调用时只传类型字符串:
exporters.get(type).export(data) - 类型不存在?直接抛
IllegalArgumentException,比静默失败更安全
配合 sealed class 或枚举提升健壮性
Java 17+ 可用 sealed interface ExportFormat 明确限定所有合法类型:
- 子类只能是
PdfFormat、DocxFormat、CsvFormat - 搭配
switch (format) { case PdfFormat f -> ... },编译器自动检查是否遗漏分支 - 比运行时 if-else 更早发现问题,也比字符串硬编码更不易拼错
不复杂但容易忽略:真正适合多态的场景,是各分支有明显行为差异、可能持续扩展、且共性足够强。如果只是后缀名不同或 header 差一个字段,配置驱动反而更轻量。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











