当前位置: 首页 > news >正文

java23种设计模式-抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)学习笔记

🌟 定义

抽象工厂模式属于创建型设计模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。是工厂方法模式的升级版,支持多个产品族的创建。


🎯 适用场景

  1. 需要创建产品家族(多个关联产品)
  2. 系统要独立于产品的创建、组合和表示
  3. 需要确保产品之间的兼容性
  4. 需要切换不同产品系列
  5. 产品对象有多个创建约束条件

🔧 模式结构

📐 类图

«interface»
AbstractFactory
+createProductA() : AbstractProductA
+createProductB() : AbstractProductB
ConcreteFactory1
+createProductA() : AbstractProductA
+createProductB() : AbstractProductB
ConcreteFactory2
+createProductA() : AbstractProductA
+createProductB() : AbstractProductB
«interface»
AbstractProductA
+operationA()
ProductA1
+operationA()
ProductA2
+operationA()
«interface»
AbstractProductB
+operationB()
ProductB1
+operationB()
ProductB2
+operationB()

🛠️ 核心组成

  1. AbstractFactory(抽象工厂)

    • 声明创建产品族的方法集合
  2. ConcreteFactory(具体工厂)

    • 实现抽象工厂接口,创建特定产品族的对象
  3. AbstractProduct(抽象产品)

    • 定义产品接口,多个产品构成产品族
  4. ConcreteProduct(具体产品)

    • 实现抽象产品接口的具体类

📝 代码示例

跨平台UI组件案例

// 抽象产品:按钮
interface Button {
    void render();
}

// 具体产品:Windows按钮
class WindowsButton implements Button {
    @Override
    public void render() {
        System.out.println("渲染Windows风格按钮");
    }
}

// 具体产品:MacOS按钮
class MacOSButton implements Button {
    @Override
    public void render() {
        System.out.println("渲染MacOS风格按钮");
    }
}

// 抽象产品:文本框
interface TextField {
    void input();
}

// 具体产品:Windows文本框
class WindowsTextField implements TextField {
    @Override
    public void input() {
        System.out.println("Windows文本框输入");
    }
}

// 具体产品:MacOS文本框
class MacOSTextField implements TextField {
    @Override
    public void input() {
        System.out.println("MacOS文本框输入");
    }
}

// 抽象工厂
interface GUIFactory {
    Button createButton();
    TextField createTextField();
}

// 具体工厂:Windows组件工厂
class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public TextField createTextField() {
        return new WindowsTextField();
    }
}

// 具体工厂:MacOS组件工厂
class MacOSFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacOSButton();
    }

    @Override
    public TextField createTextField() {
        return new MacOSTextField();
    }
}

// 客户端代码
public class Application {
    private Button button;
    private TextField textField;

    public Application(GUIFactory factory) {
        button = factory.createButton();
        textField = factory.createTextField();
    }

    public void renderUI() {
        button.render();
        textField.input();
    }

    public static void main(String[] args) {
        // 根据配置选择工厂
        GUIFactory factory = getOSFactory();
        Application app = new Application(factory);
        app.renderUI();
    }

    private static GUIFactory getOSFactory() {
        String osName = System.getProperty("os.name").toLowerCase();
        if (osName.contains("win")) {
            return new WindowsFactory();
        } else {
            return new MacOSFactory();
        }
    }
}

✅ 优点

  1. 产品族一致性:保证创建的对象相互兼容
  2. 切换产品族方便:只需更换具体工厂
  3. 解耦客户端与具体类:客户端只操作抽象接口
  4. 符合开闭原则(对扩展开放-新增产品族)
  5. 符合单一职责原则:将产品创建逻辑集中管理

⚠️ 缺点

  1. 扩展产品等级困难(对修改关闭-新增产品类型)
  2. 类数量膨胀(n个产品族×m个产品类型=n×m个类)
  3. 增加系统抽象性(需要先设计好产品结构)
  4. 需要提前预判产品变化方向

🔄 相关模式对比

模式区别
工厂方法模式单个产品等级 vs 多个产品等级
建造者模式分步构建复杂对象 vs 创建产品家族
原型模式克隆现有对象 vs 创建新对象系列

💡 实践建议

  1. 产品族设计原则

    • 同一产品族中的对象需要协同工作
    • 不同产品族的对象不应混合使用
  2. 层次结构管理

    // 使用Map维护工厂实例
    public class FactoryProducer {
        private static Map<String, GUIFactory> factories = new HashMap<>();
        
        static {
            factories.put("Windows", new WindowsFactory());
            factories.put("MacOS", new MacOSFactory());
        }
        
        public static GUIFactory getFactory(String type) {
            return factories.get(type);
        }
    }
    
  3. 扩展策略

    • 新增产品族:添加新工厂+对应产品实现
    • 新增产品类型:需要修改所有工厂接口(慎用)
  4. 组合使用技巧

    // 结合单例模式管理工厂
    class MacOSFactory {
        private static final MacOSFactory INSTANCE = new MacOSFactory();
        private MacOSFactory() {}
        public static MacOSFactory getInstance() { return INSTANCE; }
    }
    

🚀 典型应用

  1. 跨平台UI框架

    • Java AWT/Swing的Peer机制
    • Android/iOS跨平台开发
  2. 数据库访问层

    // 抽象产品:Connection/Statement
    interface DatabaseFactory {
        Connection createConnection();
        Statement createStatement();
    }
    
    // 具体产品:MySQL/Oracle实现
    
  3. 游戏引擎

    • 不同画风的角色/场景/道具组合
    • 不同物理引擎的实现组合
  4. 企业级中间件

    • 不同消息队列的Connection/Session组合
    • 不同云服务的存储/计算组件组合

📌 实现注意事项

  1. 空对象处理

    // 空产品实现示例
    class NullButton implements Button {
        @Override
        public void render() {
            // 无操作实现
        }
    }
    
  2. 参数化工厂

    // 通过枚举类型选择产品
    enum ThemeType { MATERIAL, FLAT, RETRO }
    
    class ThemeFactory {
        public static GUIFactory getFactory(ThemeType type) {
            switch(type) {
                case MATERIAL: return new MaterialFactory();
                case FLAT: return new FlatFactory();
                default: return new RetroFactory();
            }
        }
    }
    
  3. 组合产品创建

    // 创建关联产品组
    interface VehicleFactory {
        Engine createEngine();
        Wheel createWheel();
        Light createLight();
    }
    
    class CarFactory implements VehicleFactory {
        // 实现各部件创建方法
    }
    

掌握抽象工厂模式的关键在于理解产品族产品等级的关系,合理运用可以有效管理系统中的对象创建逻辑,特别适合需要保证产品兼容性和需要动态切换产品系列的复杂系统设计。

相关文章:

  • 长春网站建设电话牡丹江seo
  • js做网站统计郑州网站推广公司咨询
  • 营销和运营的区别是什么seo诊断站长
  • wordpress 后台界面抖音seo关键词优化
  • 网购平台大全seo 的作用和意义
  • 网站建设服务公司哪家好百度关键词优化多久上首页
  • DeepSeek-R1:通过强化学习激励大语言模型的推理能力
  • 陀螺匠·企业助手v1.8 产品介绍
  • c++_string模拟实现
  • Eureka、ZooKeeper 和 Nacos 之间的对比
  • YOLO11改进-模块-引入混合结构模块Mix Structure Block 提高多尺度、小目标
  • 使用Windbg调试目标进程排查C++软件异常的一般步骤与要点分享
  • 6层高速PCB设计入门第1~10讲
  • STM32CUBEIDE FreeRTOS操作教程(十三):task api 任务访问函数
  • 原生稀疏注意力NSA 替换transformer 注意力进行文本生成训练
  • Web自动化之Selenium添加网站Cookies实现免登录
  • C++ ——— 二叉搜索树
  • EasyExcel 使用指南:基础操作与常见问题
  • MySQL 最左前缀原则:原理、应用与优化
  • Winform工具箱、属性、事件
  • 04基于vs2022的c语言笔记——数据类型
  • C# httpclient 和 Flurl.Http 的测试
  • Mesh自组网技术及应用
  • Threejs教程三【揭秘3D贴图魔法】
  • 如何使用爬虫获取淘宝商品详情:API返回值说明与案例指南
  • Unity 第三人称人物切动画时人物莫名旋转