小易说IT 小易说IT

Java抽象工厂模式(Abstract Factory)代码示例

抽象工厂:提供一个接口,用于创建一系列相关 / 相互依赖的产品族,而不需要指定它们的具体类。

  • 工厂方法:一个工厂只生产 1 种产品

  • 抽象工厂:一个工厂可以生产一整套产品族(多个相关产品)

产品族举例:

  • 小米产品族:小米手机、小米平板

  • 华为产品族:华为手机、华为平板

一套抽象工厂,切换不同工厂,就整套更换这一组产品。

类角色

  1. AbstractProductX / AbstractProductY:抽象产品(多个产品等级)

  2. ConcreteProduct:具体产品,归属不同产品族

  3. AbstractFactory:抽象工厂,定义一组创建不同产品的方法

  4. ConcreteFactory:具体工厂,实现,生产完整一套产品族

  5. Client:客户端,只依赖抽象,不碰具体实现

// ====================== 抽象产品1:手机 ======================
interface Phone {
    void showPhoneInfo();
}

// ====================== 抽象产品2:平板 ======================
interface Pad {
    void showPadInfo();
}

// -------- 小米产品族实现 --------
class XiaomiPhone implements Phone {
    @Override
    public void showPhoneInfo() {
        System.out.println("小米手机:澎湃OS系统");
    }
}

class XiaomiPad implements Pad {
    @Override
    public void showPadInfo() {
        System.out.println("小米平板:大屏办公");
    }
}

// -------- 华为产品族实现 --------
class HuaweiPhone implements Phone {
    @Override
    public void showPhoneInfo() {
        System.out.println("华为手机:鸿蒙系统");
    }
}

class HuaweiPad implements Pad {
    @Override
    public void showPadInfo() {
        System.out.println("华为平板:多屏协同");
    }
}

// ====================== 抽象工厂:定义产品族所有产品的创建接口 ======================
interface AbstractFactory {
    // 创建手机
    Phone createPhone();
    // 创建平板
    Pad createPad();
}

// ====================== 具体工厂:小米工厂,生产整套小米产品族 ======================
class XiaomiFactory implements AbstractFactory {
    @Override
    public Phone createPhone() {
        return new XiaomiPhone();
    }

    @Override
    public Pad createPad() {
        return new XiaomiPad();
    }
}

// ====================== 具体工厂:华为工厂,生产整套华为产品族 ======================
class HuaweiFactory implements AbstractFactory {
    @Override
    public Phone createPhone() {
        return new HuaweiPhone();
    }

    @Override
    public Pad createPad() {
        return new HuaweiPad();
    }
}

// ====================== 客户端测试 ======================
public class AbstractFactoryDemo {
    public static void main(String[] args) {
        // 切换工厂,整套产品一起切换
        AbstractFactory factory;

        System.out.println("==== 使用小米产品族 ====");
        factory = new XiaomiFactory();
        Phone xiaomiPhone = factory.createPhone();
        Pad xiaomiPad = factory.createPad();
        xiaomiPhone.showPhoneInfo();
        xiaomiPad.showPadInfo();

        System.out.println("\n==== 使用华为产品族 ====");
        factory = new HuaweiFactory();
        Phone huaweiPhone = factory.createPhone();
        Pad huaweiPad = factory.createPad();
        huaweiPhone.showPhoneInfo();
        huaweiPad.showPadInfo();
    }
}

运行输出

==== 使用小米产品族 ====
小米手机:澎湃OS系统
小米平板:大屏办公

==== 使用华为产品族 ====
华为手机:鸿蒙系统
华为平板:多屏协同

Mermaid UML 图

抽象工厂模式优缺点

✅ 优点

  1. 保证产品族内的产品配套使用,切换整套产品族只需要换一个工厂实例

  2. 客户端只依赖抽象接口,具体实现隔离

  3. 符合开闭原则:新增一套产品族,只需要新增一套产品 + 一个工厂,原有代码不用改

❌ 缺点

增加新的产品等级(比如新增「耳机」)非常麻烦,需要修改抽象工厂接口,所有的具体工厂全部要改动,违反开闭原则。 👉 适合:产品族固定,产品等级不会频繁新增的场景。

三种工厂模式快速对比

模式

核心特点

适用场景

简单工厂

一个工厂类,if‑else 创建产品

产品少,简单业务

工厂方法

一个工厂只生产一种产品;一个产品对应一个工厂

产品等级会频繁增加

抽象工厂

一个工厂生产一整套产品族;多组相关产品成套创建

产品族固定,成套切换

拓展小提示:Spring 中 BeanFactory 就是工厂方法思想;抽象工厂适合做多套组件替换,例如多数据库适配、多套 UI 主题。


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

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

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

https://www.yijunzhao.cc/