工厂方法模式通过为每种产品定义独立工厂子类,实现“对扩展开放、对修改关闭”;核心是用抽象工厂接口声明create()方法,由具体工厂实现,新增产品只需添加产品类和对应工厂类,无需修改原有代码。

工厂方法模式通过把“创建逻辑”从一个集中式工厂类里拆出来,让每种产品对应一个独立的工厂子类,从而避免修改已有代码就能支持新类型——这正是对开闭原则的落实。
核心思路:用继承代替条件分支
简单工厂靠 if 或 switch 判断类型来决定 new 哪个对象,新增产品就得改工厂类,违反“对修改关闭”。工厂方法模式不再写判断逻辑,而是定义一个创建接口(比如 createProduct()),让每个具体产品配一个具体工厂类去实现它。
- 加一种新产品?只新增一个产品类 + 一个对应工厂类,不碰原有任何类
- 原有工厂、产品、客户端代码全都不用动
- 扩展是“加”,不是“改”
结构对比更直观
假设要支持手机和电脑两种产品:
- 简单工厂:一个 ShapeFactory 类里写 if ("phone") return new Phone(); if ("pc") return new Pc(); —— 新增平板?必须打开这个类,加 else if
- 工厂方法:定义 ProductFactory 抽象类,含抽象方法 create(); 再写 PhoneFactory 和 PcFactory 分别实现它;客户端拿哪个工厂,就得到对应产品 —— 新增平板?只加 TabletFactory 和 Tablet,其他不动
关键设计点
工厂方法真正起作用,依赖三个配合:
- 抽象工厂(接口或抽象类)声明创建方法,但不实现
- 具体工厂各自实现创建逻辑,只负责一种产品
- 客户端面向抽象工厂编程,运行时才决定用哪个具体工厂
注意边界:它解决的是“一类产品”的扩展
工厂方法适合产品种类稳定、但具体实现常变的场景(比如日志组件:FileLogger、DBLogger、CloudLogger)。如果产品本身维度变多(比如既要不同品牌,又要不同操作系统),就需要升级到抽象工厂模式。它不解决“多维度组合爆炸”,但把单维度扩展做得干净利落。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











