完整教程:抽象工厂模式深度解析:构建产品家族的艺术
模式定义与核心思想
抽象工厂模式是一种创建型设计模式,它提供了一种封装一组具有共同主题的独立工厂的方式,而无需指定它们的具体类。简单来说,抽象工厂是工厂的工厂。
核心哲学
“围绕一个主题,创建一整套相互关联的产品”
️ 基础架构与角色分析
模式结构组成
| 角色 | 职责 | 示例 |
|---|---|---|
| 抽象工厂 | 声明创建抽象产品的方法 | 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);
}
}
架构演进:从简单到复杂
第一代:基础抽象工厂
第二代:支持主题切换
// 扩展支持主题
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 工厂方法
| 维度 | 抽象工厂 | 工厂方法 |
|---|---|---|
| 产品关系 | 产品家族,多个相关产品 | 单一产品 |
| 扩展性 | 增加产品族容易,增加产品等级难 | 增加产品等级容易 |
| 复杂度 | 较高 | 中等 |
| 使用场景 | 系统需要多个产品系列 | 系统只需要一种产品 |
架构决策流程图
最佳实践与陷阱规避
✅ 最佳实践
- 接口隔离:每个工厂职责单一
- 命名规范:工厂名称体现产品族特征
- 文档完善:明确每个工厂创建的产品系列
- 错误处理:提供有意义的异常信息
❌ 常见陷阱
- 过度设计:不需要产品族时不要使用抽象工厂
- 违反开闭原则:增加新产品类型困难
- 工厂膨胀:一个工厂创建过多不相关产品
重构技巧
// 重构前:违反单一职责
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框架到数据库抽象,从微服务架构到游戏开发,抽象工厂都在默默地发挥着重要作用。
掌握抽象工厂模式,意味着你不仅学会了一种设计模式,更获得了一种构建复杂系统的思维方式。这种思维方式将帮助你在面对复杂业务场景时,能够设计出更加优雅、健壮的架构解决方案。
浙公网安备 33010602011771号