多态是工厂模式解耦的根基,工厂必须返回接口或抽象类而非具体实现类,业务代码仅持接口引用并依赖jvm虚方法表动态绑定,禁止instanceof和强制转型,新增实现只需扩展工厂分支且业务代码零修改。

多态是工厂模式真正解耦的根基,不是可选项,而是必须项。工厂返回接口类型,业务代码只面向接口调用,运行时才决定执行哪个具体类的方法——这个过程就是多态在起作用。
工厂方法必须返回接口或抽象类
工厂的创建方法(如 createPaymentProcessor())返回类型不能是 AlipayProcessor 或 WechatProcessor 这样的具体类,而必须是统一的 PaymentProcessor 接口或抽象类。这样客户端拿到的始终是同一类型引用,编译期完全不依赖实现细节。
- 返回 Object 或裸泛型会丢失类型安全,也破坏多态前提
- 接口比抽象类更推荐:契约清晰、无单继承限制、聚焦行为定义
- 如果多个实现共享初始化逻辑,可放在抽象基类构造器中,由子类 super() 触发
业务代码只持接口引用,不关心实际类型
像 OrderService 这类业务类,成员变量声明为 PaymentProcessor processor,调用 processor.pay(amount) 时,JVM 查虚方法表自动绑定到真实对象的方法。整个过程对开发者透明,但决定了行为是否可替换。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 禁止在业务层使用 instanceof 或强制转型——这是多态被破坏的明确信号
- 新增支付方式(如 ApplePayProcessor)只需实现接口 + 扩展工厂分支,业务代码零修改
- 测试时可直接注入 Mock 实现,无需改动被测类结构
工厂自身也应支持多态扩展
推荐用工厂方法模式而非静态简单工厂。定义 PaymentFactory 接口,每个渠道对应一个实现类(AlipayFactory、WechatFactory)。这些工厂本身也是多态参与者,上层只依赖接口,不关心谁来创建。
- 避免把所有创建逻辑塞进一个类,否则新增渠道就得改源码,违背开闭原则
- 工厂内部可自由决定实例化方式:new、缓存、代理、装饰,都不影响调用方
- Spring 环境下用 @Qualifier 注入不同工厂 Bean,彻底消除 new 和字符串硬编码
配置驱动选择,远离编译期耦合
工厂接收的参数建议用字符串(如 "alipay")或枚举,而不是类名或 Class 对象。映射逻辑封装在工厂内部,外部通过配置文件(如 application.yml)控制行为切换。
- 一行配置从 payment.type=alipay 改成 paypal,行为自动变化
- 业务类应通过构造器或 setter 接收工厂依赖,而不是自己 new 工厂
- 所有产品类必须实现同一接口,不能仅靠继承某个基类——否则无法跨体系复用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










