工厂方法模式:定义一个创建对象的抽象工厂,让子类决定实例化哪一个类。把对象实例化延迟到子类完成,符合开闭原则。
简单工厂:一个工厂类,if‑else 判断创建产品
工厂方法:抽象工厂 + 多个具体工厂,每个工厂只生产一种产品
类结构说明
Product(抽象产品):产品公共接口
ConcreteProductA / ConcreteProductB:具体产品实现
Factory(抽象工厂):定义工厂方法
createProduct()ConcreteFactoryA / ConcreteFactoryB:具体工厂,重写工厂方法生产对应产品
// ====================== 1.抽象产品接口 ======================
interface Product {
void doWork();
}
// ====================== 2.具体产品A ======================
class ConcreteProductA implements Product {
@Override
public void doWork() {
System.out.println("【产品A】执行业务逻辑");
}
}
// ====================== 3.具体产品B ======================
class ConcreteProductB implements Product {
@Override
public void doWork() {
System.out.println("【产品B】执行业务逻辑");
}
}
// ====================== 4.抽象工厂:工厂方法模式核心 ======================
abstract class Factory {
// 工厂方法,返回抽象产品,交由子类实现
public abstract Product createProduct();
// 工厂可以包含公共业务逻辑
public void commonOperation() {
Product product = createProduct();
System.out.println("工厂内部统一处理,调用产品方法:");
product.doWork();
}
}
// ====================== 5.具体工厂A:生产产品A ======================
class ConcreteFactoryA extends Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// ====================== 6.具体工厂B:生产产品B ======================
class ConcreteFactoryB extends Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
// ====================== 客户端测试代码 ======================
public class FactoryMethodDemo {
public static void main(String[] args) {
// 使用工厂A创建产品A
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.doWork();
factoryA.commonOperation();
System.out.println("------------------------");
// 使用工厂B创建产品B
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.doWork();
factoryB.commonOperation();
}
}
输出结果
【产品A】执行业务逻辑
工厂内部统一处理,调用产品方法:
【产品A】执行业务逻辑
------------------------
【产品B】执行业务逻辑
工厂内部统一处理,调用产品方法:
【产品B】执行业务逻辑
UML Mermaid 图

工厂方法优缺点
✅ 优点
新增产品时,只需要新增产品类 + 对应工厂类,不用修改原有代码,满足开闭原则
对象创建职责隔离,每个工厂只负责一种产品
❌ 缺点
每增加一个产品,就要新增一对【产品 + 工厂】类,类数量膨胀
和简单工厂对比
简单工厂:全部创建逻辑在一个工厂类,新增产品要改工厂代码,违反开闭
工厂方法:每个产品对应一个工厂,扩展只加类,不改旧代码,但类变多
本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问