核心在于用抽象类型声明、靠运行时绑定、让调用方只依赖接口:工厂方法返回接口(如PaymentProcessor),调用方通过该接口调用process(),JVM动态绑定到AlipayProcessor等具体实现,新增子类无需修改业务代码。

Java 利用多态实现工厂方法模式,核心在于用抽象类型声明、靠运行时绑定、让调用方只依赖接口。不是靠 if-else 创建后硬转类型,而是从源头就用父类(或接口)引用接收对象,把“是什么”交给子类决定,“怎么用”留给接口约定。
返回值必须是抽象类型(接口或抽象类)
工厂方法的返回类型不能是具体类,比如 AlipayProcessor 或 PayPalProcessor,而必须是它们共同实现的接口,例如:
-
PaymentProcessor createProcessor(String type)✅ 正确:返回统一抽象类型 -
Object createProcessor(String type)❌ 错误:失去编译期检查和多态能力 -
AlipayProcessor createProcessor(String type)❌ 错误:调用方被绑定死,无法切换实现
只有返回 PaymentProcessor 这样的抽象类型,后续调用 p.process() 才能自动走到对应子类的实现——这是多态生效的第一步。
子类各自实现同一接口,行为互不干扰
每个具体产品类都实现相同接口,但内部逻辑完全独立:
立即学习“Java免费学习笔记(深入)”;
-
AlipayProcessor.process()调用支付宝 SDK -
PayPalProcessor.process()发送 HTTP 请求到 PayPal 网关 -
WechatProcessor.process()启动微信 JSAPI 支付流程
调用方代码始终写成 processor.process(order),无需 if 判断、不关心是谁在执行。新增 ApplePayProcessor 时,只要它实现 PaymentProcessor,已有业务代码一行都不用改。
创建时必须用父类引用指向子类实例
多态生效的关键操作是声明与实际分离:
-
PaymentProcessor p = factory.create("alipay");✅ 编译看接口,运行找子类 -
AlipayProcessor p = (AlipayProcessor) factory.create("alipay");❌ 强转破坏封装,丧失扩展性
调试时你会看到变量 p 的类型显示为 PaymentProcessor,但实际对象是 AlipayProcessor@xxxx——这就是动态绑定在起作用。IDE 和 JVM 都按这个规则工作。
工厂内部选择逻辑可配置、可替换
工厂本身可以是简单分支判断,也可以是 Spring 中的条件化 Bean:
- 用字符串参数:
if ("alipay".equals(type)) return new AlipayProcessor(); - 用枚举驱动:
PaymentType.ALIPAY → AlipayProcessor - 用配置文件控制:
payment.type=wechat,配合@ConditionalOnProperty - 测试时直接注入
MockProcessor,零侵入替换真实实现
无论工厂怎么选,只要返回的是 PaymentProcessor,上层代码就完全不受影响——这才是多态支撑下的松耦合。


















