抽象工厂:提供一个接口,用于创建一系列相关 / 相互依赖的产品族,而不需要指定它们的具体类。
工厂方法:一个工厂只生产 1 种产品
抽象工厂:一个工厂可以生产一整套产品族(多个相关产品)
产品族举例:
小米产品族:小米手机、小米平板
华为产品族:华为手机、华为平板
一套抽象工厂,切换不同工厂,就整套更换这一组产品。
类角色
AbstractProductX / AbstractProductY:抽象产品(多个产品等级)
ConcreteProduct:具体产品,归属不同产品族
AbstractFactory:抽象工厂,定义一组创建不同产品的方法
ConcreteFactory:具体工厂,实现,生产完整一套产品族
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 图
抽象工厂模式优缺点
✅ 优点
保证产品族内的产品配套使用,切换整套产品族只需要换一个工厂实例
客户端只依赖抽象接口,具体实现隔离
符合开闭原则:新增一套产品族,只需要新增一套产品 + 一个工厂,原有代码不用改
❌ 缺点
增加新的产品等级(比如新增「耳机」)非常麻烦,需要修改抽象工厂接口,所有的具体工厂全部要改动,违反开闭原则。 👉 适合:产品族固定,产品等级不会频繁新增的场景。
三种工厂模式快速对比
拓展小提示:Spring 中 BeanFactory 就是工厂方法思想;抽象工厂适合做多套组件替换,例如多数据库适配、多套 UI 主题。
本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问