抽象类不能实例化,但作为工厂模式中产品体系的顶层契约,定义公共行为与属性;工厂类封装创建逻辑,根据条件返回具体子类实例,客户端仅依赖抽象类类型,实现解耦与多态。

抽象类本身不能直接实例化,但它是工厂模式中组织产品体系的核心基础。工厂模式通过封装创建逻辑,让调用方只面向抽象类(或接口)编程,而由工厂决定返回哪个具体子类的实例。
抽象类作为产品顶层定义
抽象类定义公共行为和共性属性,不关心具体实现。比如:
-
Animal 是抽象类,声明
run()抽象方法 -
Dog 和 Cat 分别继承 Animal 并实现
run() - 客户端代码只依赖
Animal类型,不写new Dog()
工厂类根据条件返回具体子类实例
工厂内部用 new 创建子类对象,但对外统一返回抽象类引用:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 工厂方法如
createAnimal(String type)内部判断类型,返回new Dog()或new Cat() - 返回类型是
Animal,调用方拿到的是多态对象,可直接调用run() - 新增
Bird子类时,只需扩展工厂的判断逻辑,不改客户端代码
结合方式的关键点
这种结合不是语法强制,而是设计约定,重点在于:
- 抽象类提供稳定的契约,子类负责具体实现
- 工厂类承担“选择谁来干活”的职责,屏蔽 new 的细节
- 客户端持有抽象类引用,运行时绑定到实际子类,体现多态本质
- 抽象类可含默认实现、构造器、protected 成员,比接口更灵活,适合有共性逻辑的场景
一个精简示例
假设抽象类 Payment 定义 pay(double amount),子类 WechatPay 和 Alipay 各自实现。工厂这样写:
return switch (channel) {
case "wechat" -> new WechatPay();
case "alipay" -> new Alipay();
default -> throw new IllegalArgumentException();
};
}
调用方:Payment p = PaymentFactory.create("wechat"); p.pay(100.0); —— 完全不知道也不需要知道背后是哪个子类。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










