完整教程:抽象工厂模式深度解析:构建产品家族的艺术

模式定义与核心思想

抽象工厂模式是一种创建型设计模式,它提供了一种封装一组具有共同主题的独立工厂的方式,而无需指定它们的具体类。简单来说,抽象工厂是工厂的工厂

核心哲学

“围绕一个主题,创建一整套相互关联的产品”

产品族B
产品族A
产品B1
产品B2
产品B3
产品A1
产品A2
产品A3
抽象工厂
具体工厂A
具体工厂B

️ 基础架构与角色分析

模式结构组成

角色职责示例
抽象工厂声明创建抽象产品的方法UIFactory
具体工厂实现抽象工厂,创建具体产品WindowsFactory, MacFactory
抽象产品声明产品接口Button, Checkbox
具体产品实现抽象产品接口WindowsButton, MacButton
客户端使用抽象工厂和产品接口Application

完整代码示例:跨平台UI组件

抽象产品层

// 抽象按钮
public interface Button {
void render();
void onClick();
}
// 抽象复选框
public interface Checkbox {
void render();
boolean isChecked();
}
// 抽象文本框
public interface TextField {
void render();
String getText();
void setText(String text);
}

具体产品实现

// Windows系列产品
public class WindowsButton implements Button {
@Override
public void render() {
System.out.println("渲染Windows风格按钮");
}
@Override
public void onClick() {
System.out.println("Windows按钮点击效果");
}
}
public class WindowsCheckbox implements Checkbox {
private boolean checked;
@Override
public void render() {
System.out.println("渲染Windows风格复选框: " + (checked ? "✓" : "☐"));
}
@Override
public boolean isChecked() {
return checked;
}
}
// Mac系列产品  
public class MacButton implements Button {
@Override
public void render() {
System.out.println("渲染macOS风格按钮");
}
@Override
public void onClick() {
System.out.println("macOS按钮点击效果");
}
}
public class MacCheckbox implements Checkbox {
private boolean checked;
@Override
public void render() {
System.out.println("渲染macOS风格复选框: " + (checked ? "✅" : "⭕"));
}
@Override
public boolean isChecked() {
return checked;
}
}

抽象工厂接口

public interface UIFactory {
Button createButton();
Checkbox createCheckbox();
TextField createTextField();
// 可以扩展更多UI组件
// ScrollBar createScrollBar();
// Menu createMenu();
}

具体工厂实现

// Windows工厂
public class WindowsFactory implements UIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
@Override
public TextField createTextField() {
return new WindowsTextField();
}
}
// Mac工厂
public class MacFactory implements UIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public Checkbox createCheckbox() {
return new MacCheckbox();
}
@Override
public TextField createTextField() {
return new MacTextField();
}
}
// 新增Linux工厂
public class LinuxFactory implements UIFactory {
@Override
public Button createButton() {
return new LinuxButton();
}
@Override
public Checkbox createCheckbox() {
return new LinuxCheckbox();
}
@Override
public TextField createTextField() {
return new LinuxTextField();
}
}

客户端使用

public class Application {
private final UIFactory factory;
private Button button;
private Checkbox checkbox;
public Application(UIFactory factory) {
this.factory = factory;
}
public void createUI() {
this.button = factory.createButton();
this.checkbox = factory.createCheckbox();
}
public void render() {
button.render();
checkbox.render();
}
// 根据运行时环境选择工厂
public static Application createApplication() {
String osName = System.getProperty("os.name").toLowerCase();
UIFactory factory;
if (osName.contains("mac")) {
factory = new MacFactory();
} else if (osName.contains("windows")) {
factory = new WindowsFactory();
} else {
factory = new LinuxFactory(); // 默认Linux
}
return new Application(factory);
}
}

架构演进:从简单到复杂

第一代:基础抽象工厂

«interface»
UIFactory
+createButton() : Button
+createCheckbox() : Checkbox
WindowsFactory
+createButton() : Button
+createCheckbox() : Checkbox
MacFactory
+createButton() : Button
+createCheckbox() : Checkbox

第二代:支持主题切换

// 扩展支持主题
public interface ThemedUIFactory extends UIFactory {
Theme getTheme();
ColorScheme getColorScheme();
// 主题相关组件
Tooltip createTooltip();
Dialog createDialog();
}
public enum Theme {
LIGHT, DARK, HIGH_CONTRAST
}
// 具体实现
public class DarkWindowsFactory extends WindowsFactory implements ThemedUIFactory {
@Override
public Theme getTheme() {
return Theme.DARK;
}
@Override
public ColorScheme getColorScheme() {
return new DarkColorScheme();
}
@Override
public Tooltip createTooltip() {
return new DarkTooltip();
}
}

第三代:动态工厂组合

// 支持动态配置的工厂
public class DynamicUIFactory implements UIFactory {
private final ComponentFactory buttonFactory;
private final ComponentFactory checkboxFactory;
private final ComponentFactory textFieldFactory;
public DynamicUIFactory(Platform platform, Theme theme) {
this.buttonFactory = ComponentRegistry.getFactory(platform, theme, ComponentType.BUTTON);
this.checkboxFactory = ComponentRegistry.getFactory(platform, theme, ComponentType.CHECKBOX);
this.textFieldFactory = ComponentRegistry.getFactory(platform, theme, ComponentType.TEXT_FIELD);
}
@Override
public Button createButton() {
return (Button) buttonFactory.create();
}
@Override
public Checkbox createCheckbox() {
return (Checkbox) checkboxFactory.create();
}
@Override
public TextField createTextField() {
return (TextField) textFieldFactory.create();
}
}

企业级应用:数据库抽象工厂

多数据库支持架构

// 抽象数据库产品
public interface Connection {
void connect();
void disconnect();
Statement createStatement();
}
public interface Statement {
ResultSet executeQuery(String sql);
int executeUpdate(String sql);
}
public interface ResultSet {
boolean next();
String getString(int column);
int getInt(int column);
}
// 抽象数据库工厂
public interface DatabaseFactory {
Connection createConnection(String url, Properties props);
Statement createStatement();
ResultSet createResultSet();
// 元数据操作
DatabaseMetaData getMetaData();
}
// MySQL实现
public class MySQLFactory implements DatabaseFactory {
@Override
public Connection createConnection(String url, Properties props) {
return new MySQLConnection(url, props);
}
@Override
public Statement createStatement() {
return new MySQLStatement();
}
@Override
public ResultSet createResultSet() {
return new MySQLResultSet();
}
@Override
public DatabaseMetaData getMetaData() {
return new MySQLMetaData();
}
}
// PostgreSQL实现
public class PostgreSQLFactory implements DatabaseFactory {
@Override
public Connection createConnection(String url, Properties props) {
return new PostgreSQLConnection(url, props);
}
@Override
public Statement createStatement() {
return new PostgreSQLStatement();
}
@Override
public ResultSet createResultSet() {
return new PostgreSQLResultSet();
}
@Override
public DatabaseMetaData getMetaData() {
return new PostgreSQLMetaData();
}
}

数据库工厂管理器

public class DatabaseFactoryManager {
private static final Map<String, DatabaseFactory> factories = new ConcurrentHashMap<>();
  static {
  // 注册已知数据库工厂
  registerFactory("mysql", new MySQLFactory());
  registerFactory("postgresql", new PostgreSQLFactory());
  registerFactory("oracle", new OracleFactory());
  }
  public static void registerFactory(String databaseType, DatabaseFactory factory) {
  factories.put(databaseType.toLowerCase(), factory);
  }
  public static DatabaseFactory getFactory(String databaseType) {
  DatabaseFactory factory = factories.get(databaseType.toLowerCase());
  if (factory == null) {
  throw new IllegalArgumentException("不支持的数据库类型: " + databaseType);
  }
  return factory;
  }
  // 根据JDBC URL自动检测
  public static DatabaseFactory detectFactory(String jdbcUrl) {
  if (jdbcUrl.startsWith("jdbc:mysql:")) {
  return getFactory("mysql");
  } else if (jdbcUrl.startsWith("jdbc:postgresql:")) {
  return getFactory("postgresql");
  } else if (jdbcUrl.startsWith("jdbc:oracle:")) {
  return getFactory("oracle");
  }
  throw new IllegalArgumentException("无法识别的JDBC URL: " + jdbcUrl);
  }
  }

⚡ 性能优化与缓存策略

带缓存的抽象工厂

public class CachedUIFactory implements UIFactory {
private final UIFactory targetFactory;
private final Map<Class<?>, Object> cache = new ConcurrentHashMap<>();
  private final boolean enabled;
  public CachedUIFactory(UIFactory targetFactory, boolean enabled) {
  this.targetFactory = targetFactory;
  this.enabled = enabled;
  }
  @Override
  @SuppressWarnings("unchecked")
  public Button createButton() {
  if (!enabled) {
  return targetFactory.createButton();
  }
  return (Button) cache.computeIfAbsent(Button.class, k -> targetFactory.createButton());
  }
  @Override
  @SuppressWarnings("unchecked")
  public Checkbox createCheckbox() {
  if (!enabled) {
  return targetFactory.createCheckbox();
  }
  return (Checkbox) cache.computeIfAbsent(Checkbox.class, k -> targetFactory.createCheckbox());
  }
  public void clearCache() {
  cache.clear();
  }
  public int getCacheSize() {
  return cache.size();
  }
  }

对象池集成

public class PooledDatabaseFactory implements DatabaseFactory {
private final DatabaseFactory targetFactory;
private final ObjectPool<Connection> connectionPool;
  private final ObjectPool<Statement> statementPool;
    public PooledDatabaseFactory(DatabaseFactory targetFactory,
    int maxConnections, int maxStatements) {
    this.targetFactory = targetFactory;
    this.connectionPool = new GenericObjectPool<>(new ConnectionPooledObjectFactory(), maxConnections);
      this.statementPool = new GenericObjectPool<>(new StatementPooledObjectFactory(), maxStatements);
        }
        @Override
        public Connection createConnection(String url, Properties props) {
        try {
        PooledConnection pooledConn = (PooledConnection) connectionPool.borrowObject();
        pooledConn.realConnection = targetFactory.createConnection(url, props);
        return pooledConn;
        } catch (Exception e) {
        throw new RuntimeException("获取连接失败", e);
        }
        }
        // 池化连接包装器
        private class PooledConnection implements Connection {
        Connection realConnection;
        boolean closed = false;
        @Override
        public void disconnect() {
        if (!closed) {
        realConnection.disconnect();
        closed = true;
        connectionPool.returnObject(this);
        }
        }
        // 委托其他方法给realConnection
        @Override
        public Statement createStatement() {
        checkClosed();
        return realConnection.createStatement();
        }
        private void checkClosed() {
        if (closed) {
        throw new IllegalStateException("连接已关闭");
        }
        }
        }
        }

测试策略与Mock实现

测试专用的抽象工厂

// 用于单元测试的Mock工厂
public class MockUIFactory implements UIFactory {
private final List<Button> createdButtons = new ArrayList<>();
  private final List<Checkbox> createdCheckboxes = new ArrayList<>();
    @Override
    public Button createButton() {
    MockButton button = new MockButton();
    createdButtons.add(button);
    return button;
    }
    @Override
    public Checkbox createCheckbox() {
    MockCheckbox checkbox = new MockCheckbox();
    createdCheckboxes.add(checkbox);
    return checkbox;
    }
    @Override
    public TextField createTextField() {
    return new MockTextField();
    }
    // 测试辅助方法
    public int getCreatedButtonCount() {
    return createdButtons.size();
    }
    public List<Button> getCreatedButtons() {
      return Collections.unmodifiableList(createdButtons);
      }
      public void reset() {
      createdButtons.clear();
      createdCheckboxes.clear();
      }
      }
      // Mock组件实现
      public class MockButton implements Button {
      private int renderCount = 0;
      private int clickCount = 0;
      @Override
      public void render() {
      renderCount++;
      }
      @Override
      public void onClick() {
      clickCount++;
      }
      // 测试验证方法
      public int getRenderCount() {
      return renderCount;
      }
      public int getClickCount() {
      return clickCount;
      }
      public boolean wasRendered() {
      return renderCount > 0;
      }
      }

集成测试配置

@Configuration
@TestConfiguration
public class TestFactoryConfig {
@Bean
@Primary  // 优先使用测试工厂
public UIFactory uiFactory() {
return new MockUIFactory();
}
@Bean
@Primary
public DatabaseFactory databaseFactory() {
return new InMemoryDatabaseFactory(); // 内存数据库,用于测试
}
}
// 内存数据库工厂,测试专用
public class InMemoryDatabaseFactory implements DatabaseFactory {
@Override
public Connection createConnection(String url, Properties props) {
return new InMemoryConnection();
}
@Override
public Statement createStatement() {
return new InMemoryStatement();
}
@Override
public ResultSet createResultSet() {
return new InMemoryResultSet();
}
@Override
public DatabaseMetaData getMetaData() {
return new InMemoryMetaData();
}
}

现代架构中的抽象工厂

微服务配置工厂

// 微服务环境下的配置工厂
public interface MicroserviceFactory {
ServiceDiscovery createServiceDiscovery();
LoadBalancer createLoadBalancer();
CircuitBreaker createCircuitBreaker();
ConfigClient createConfigClient();
}
// Kubernetes环境实现
public class KubernetesFactory implements MicroserviceFactory {
private final KubernetesClient client;
private final String namespace;
public KubernetesFactory(KubernetesClient client, String namespace) {
this.client = client;
this.namespace = namespace;
}
@Override
public ServiceDiscovery createServiceDiscovery() {
return new KubernetesServiceDiscovery(client, namespace);
}
@Override
public LoadBalancer createLoadBalancer() {
return new KubernetesLoadBalancer(client);
}
@Override
public CircuitBreaker createCircuitBreaker() {
return new Resilience4jCircuitBreaker();
}
@Override
public ConfigClient createConfigClient() {
return new KubernetesConfigMapClient(client, namespace);
}
}

Spring Boot自动配置

@Configuration
@ConditionalOnClass(name = "com.example.UIFactory")
@EnableConfigurationProperties(UiProperties.class)
public class UIFactoryAutoConfiguration {
@Bean
@ConditionalOnProperty(name = "ui.platform", havingValue = "windows")
public UIFactory windowsUIFactory() {
return new WindowsFactory();
}
@Bean
@ConditionalOnProperty(name = "ui.platform", havingValue = "mac")
public UIFactory macUIFactory() {
return new MacFactory();
}
@Bean
@ConditionalOnMissingBean
public UIFactory defaultUIFactory() {
// 根据当前操作系统自动选择
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win")) {
return new WindowsFactory();
} else if (os.contains("mac")) {
return new MacFactory();
} else {
return new LinuxFactory();
}
}
@Bean
public Application application(UIFactory uiFactory) {
return new Application(uiFactory);
}
}

模式对比与选择指南

抽象工厂 vs 工厂方法

维度抽象工厂工厂方法
产品关系产品家族,多个相关产品单一产品
扩展性增加产品族容易,增加产品等级难增加产品等级容易
复杂度较高中等
使用场景系统需要多个产品系列系统只需要一种产品

架构决策流程图

需要创建对象
产品之间有关联关系吗?
需要创建产品家族
考虑工厂方法模式
产品族会频繁变化吗?
考虑依赖注入容器
使用抽象工厂模式
需要运行时切换吗?
实现工厂选择器
静态绑定工厂
创建逻辑复杂吗?
使用工厂方法
考虑简单工厂

最佳实践与陷阱规避

✅ 最佳实践

  1. 接口隔离:每个工厂职责单一
  2. 命名规范:工厂名称体现产品族特征
  3. 文档完善:明确每个工厂创建的产品系列
  4. 错误处理:提供有意义的异常信息

❌ 常见陷阱

  1. 过度设计:不需要产品族时不要使用抽象工厂
  2. 违反开闭原则:增加新产品类型困难
  3. 工厂膨胀:一个工厂创建过多不相关产品

重构技巧

// 重构前:违反单一职责
public interface MonsterFactory {
Dragon createDragon();
Goblin createGoblin();
Weapon createWeapon();  // 武器不属于怪物家族!
Armor createArmor();    // 护甲也不属于
}
// 重构后:职责分离
public interface MonsterFactory {
Dragon createDragon();
Goblin createGoblin();
}
public interface EquipmentFactory {
Weapon createWeapon();
Armor createArmor();
}
// 组合使用
public class GameAssetFactory {
private final MonsterFactory monsterFactory;
private final EquipmentFactory equipmentFactory;
public GameAssetFactory(MonsterFactory mf, EquipmentFactory ef) {
this.monsterFactory = mf;
this.equipmentFactory = ef;
}
// 提供便捷方法
public Dragon createDragonWithWeapon() {
Dragon dragon = monsterFactory.createDragon();
Weapon weapon = equipmentFactory.createWeapon();
dragon.equip(weapon);
return dragon;
}
}

总结升华

抽象工厂模式不仅仅是一个技术实现,更是一种架构思维。它教会我们:

  • 关注点分离:将产品创建与产品使用解耦
  • 一致性保证:确保相关产品能够协同工作
  • 开闭原则实践:对扩展开放,对修改关闭
  • 依赖倒置:高层模块不依赖于低层模块的具体实现

在现代软件开发中,抽象工厂模式已经成为构建可维护、可测试、可扩展系统的基石。从UI框架到数据库抽象,从微服务架构到游戏开发,抽象工厂都在默默地发挥着重要作用。

掌握抽象工厂模式,意味着你不仅学会了一种设计模式,更获得了一种构建复杂系统的思维方式。这种思维方式将帮助你在面对复杂业务场景时,能够设计出更加优雅、健壮的架构解决方案。

posted @ 2025-11-26 19:23  clnchanpin  阅读(18)  评论(0)    收藏  举报