多态与工厂模式配合的核心是将“选哪个类”从业务逻辑中剥离,由工厂根据配置统一创建接口类型实例,运行时通过jvm动态绑定实现子类方法。

多态和工厂模式配合的关键,不是“怎么写代码”,而是“怎么把变化锁住”。配置驱动的对象创建,本质是把“选哪个类”这件事从业务逻辑里抽出来,交给工厂统一决策,再靠多态让调用方完全感知不到背后是谁。
配置决定类型,工厂封装创建
配置项(比如 application.yml 中的 payment.type=wechat)只告诉工厂“要什么”,不告诉“怎么建”。工厂读取配置后,用 if/switch 或枚举匹配,然后 new 出对应子类实例——但返回值必须是接口或抽象类类型,比如 PaymentProcessor。这样业务代码拿到的永远是同一类型引用,运行时才由 JVM 绑定到实际子类方法。
- 配置支持字符串、枚举、甚至 YAML 列表,但推荐用枚举(如 PaymentType.WECHAT),避免拼写错误和运行时异常
- 工厂内部可以读取 Spring 的 @Value("${payment.type}"),也可以通过 ApplicationContext.getBean() 动态获取 Bean
- 不要在工厂里返回 Object 或裸泛型,否则后续强转会破坏类型安全,也失去多态意义
接口统一,子类各干各的
所有具体实现类(WechatProcessor、AlipayProcessor)都实现同一个接口,各自重写相同方法签名,但内部逻辑互不影响:一个走微信 SDK,一个调支付宝 OpenAPI,一个发 HTTP 请求。业务层只调 processor.process(order),完全不用关心底层差异。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 新增支付方式(比如 PayPalProcessor),只需三步:定义枚举值、写实现类、在工厂 switch 里加 case —— 业务代码一行不改
- 通用逻辑(如日志记录、参数校验、重试机制)应抽到工具类或装饰器中,别塞进某个子类里
- 避免在子类中覆盖父类非 abstract 方法来“微调”,容易违背里氏替换原则
运行时绑定,编译期无感
多态生效的前提是声明类型与实际类型分离。必须写成 PaymentProcessor p = factory.create(type);,而不是 WechatProcessor p = ...。前者让编译器只检查接口方法是否存在,运行时才确定执行哪个子类的 process() 方法——调试时变量显示为接口名,但右键查看实际类型能清楚看到是 WechatProcessor 实例。
- Spring 环境下可用 @ConditionalOnProperty 或自定义 BeanFactoryPostProcessor 实现配置驱动的自动注入
- 测试时可直接注入 MockProcessor,无需修改工厂逻辑,也不影响业务方法签名
- 禁止用 Class.forName() 反射创建对象——绕过编译检查,出错晚、难调试、无法享受 IDE 提示
不复杂但容易忽略
多态不是为了炫技,而是把“变”的部分(创建哪个类)关进工厂这个笼子里;配置不是为了灵活,而是把“谁来变”这件事交给运维或配置中心。两者合起来,才能让业务代码对新增类型彻底免疫。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










