小易说IT 小易说IT

Java工厂方法模式(Factory Method) 代码示例

工厂方法模式:定义一个创建对象的抽象工厂,让子类决定实例化哪一个类。把对象实例化延迟到子类完成,符合开闭原则。

  • 简单工厂:一个工厂类,if‑else 判断创建产品

  • 工厂方法:抽象工厂 + 多个具体工厂,每个工厂只生产一种产品

类结构说明

  1. Product(抽象产品):产品公共接口

  2. ConcreteProductA / ConcreteProductB:具体产品实现

  3. Factory(抽象工厂):定义工厂方法 createProduct()

  4. 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 图

工厂方法优缺点

✅ 优点

  1. 新增产品时,只需要新增产品类 + 对应工厂类,不用修改原有代码,满足开闭原则

  2. 对象创建职责隔离,每个工厂只负责一种产品

❌ 缺点

  1. 每增加一个产品,就要新增一对【产品 + 工厂】类,类数量膨胀

和简单工厂对比

  • 简单工厂:全部创建逻辑在一个工厂类,新增产品要改工厂代码,违反开闭

  • 工厂方法:每个产品对应一个工厂,扩展只加类,不改旧代码,但类变多


本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。

原文链接 https://yijunzhao.cc/archives/java-factory-method-pattern-code-examples

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/