2.设计模式-ABSTRACT FACTORY(抽象工厂)
一、模式定义与核心思想
抽象工厂模式(Abstract Factory Pattern) 是一种创建型设计模式,用于封装一组具有相同主题的独立产品族的创建过程。其核心思想是:
- 产品族维度:定义同一系列产品的创建接口(如手机+耳机的组合)
- 跨平台扩展:支持不同实现方案的快速切换(如小米生态与苹果生态)
与工厂方法模式的区别:
- 工厂方法:针对单一产品等级(如仅生产手机)
- 抽象工厂:针对多个关联产品等级(同时生产手机、耳机、充电器等)
二、模式组成结构与UML
角色定义:
- AbstractFactory(抽象工厂)
- 声明创建产品族中各类产品的接口
- ConcreteFactory(具体工厂)
- 实现抽象工厂接口,生成特定系列的产品
- AbstractProduct(抽象产品)
- 定义产品接口,如Phone、Earphone
- ConcreteProduct(具体产品)
- 实现抽象产品接口的具体类
UML类图结构:
classDiagram
class AbstractFactory {
<<interface>>
+createPhone(): AbstractPhone
+createEarphone(): AbstractEarphone
}
class XiaomiFactory {
+createPhone(): XiaomiPhone
+createEarphone(): XiaomiEarphone
}
class AppleFactory {
+createPhone(): IPhone
+createEarphone(): AirPods
}
class AbstractPhone {
<<interface>>
+call(): void
}
class XiaomiPhone {
+call(): void
}
class IPhone {
+call(): void
}
AbstractFactory <|-- XiaomiFactory
AbstractFactory <|-- AppleFactory
AbstractPhone <|-- XiaomiPhone
AbstractPhone <|-- IPhone

三、代码实现示例
场景描述:构建跨品牌的电子设备生产体系
- 定义抽象产品接口
// 手机抽象接口
interface Phone {
void makeCall();
void launchApp();
}
// 耳机抽象接口
interface Earphone {
void playMusic();
void noiseCancel();
}
- 创建具体产品实现
// 小米产品线
class XiaomiPhone implements Phone {
@Override
public void makeCall() {
System.out.println("小米手机拨号中...");
}
@Override
public void launchApp() {
System.out.println("打开MIUI应用商店");
}
}
class XiaomiEarphone implements Earphone {
@Override
public void playMusic() {
System.out.println("小米耳机播放音乐");
}
@Override
public void noiseCancel() {
System.out.println("开启小米主动降噪");
}
}
// 苹果产品线
class IPhone implements Phone { /* 类似小米实现 */ }
class AirPods implements Earphone { /* 类似小米实现 */ }
- 构建抽象工厂体系
interface DeviceFactory {
Phone createPhone();
Earphone createEarphone();
}
class XiaomiFactory implements DeviceFactory {
@Override
public Phone createPhone() {
return new XiaomiPhone();
}
@Override
public Earphone createEarphone() {
return new XiaomiEarphone();
}
}
class AppleFactory implements DeviceFactory { /* 类似小米实现 */ }
- 客户端调用示例
public class Client {
public static void main(String[] args) {
// 通过配置切换产品族
DeviceFactory factory = loadFactoryConfig();
Phone phone = factory.createPhone();
Earphone earphone = factory.createEarphone();
phone.makeCall();
earphone.playMusic();
}
private static DeviceFactory loadFactoryConfig() {
// 根据配置文件返回具体工厂
return new XiaomiFactory();
}
}
四、工业级源码应用案例
1.JDBC数据库驱动
- DriverManager.getConnection()返回特定数据库的连接对象(Connection)
- 不同数据库厂商实现自己的Connection``Statement等接口
- 源码片段:
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
- Spring框架的BeanFactory
- BeanFactory作为抽象工厂接口
ApplicationContext</font>作为具体工厂实现- 生产相互关联的Bean对象(如Service与DAO)
- Java Persistence API (JPA)
EntityManagerFactory</font>作为抽象工厂- 生产
EntityManager等持久化操作对象 - 支持Hibernate、EclipseLink等不同实现
五、模式适用场景
- 跨平台产品体系:需要支持多套UI主题/多国语言等场景
- 产品组合约束:确保创建的对象属于同一系列(如不能混用不同品牌的配件)
- 框架扩展需求:允许第三方厂商实现标准接口扩展功能
六、模式优劣分析
优势:
- 强约束性:确保产品族的完整性
- 高扩展性:新增产品族无需修改已有代码
- 隐藏细节:客户端仅依赖抽象接口
劣势:
- 类膨胀问题:每新增一个产品族需要增加多个类
- 扩展产品等级困难:修改抽象工厂接口会影响所有子类
七、设计决策建议
- 产品等级稳定时优先使用抽象工厂
- 频繁变更产品等级时考虑其他模式(如建造者模式)
- 结合依赖注入框架(如Spring)管理具体工厂的创建
通过深入理解抽象工厂模式,开发者可以更好地设计高内聚、低耦合的复杂系统架构。

浙公网安备 33010602011771号