设计模式-抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式的核心思想是通过工厂接口封装对象的创建过程,并允许客户端使用统一的方式来创建不同种类的对象。


抽象工厂模式的结构:

  1. 抽象工厂(AbstractFactory)
    • 定义创建一组相关产品的接口。
  2. 具体工厂(ConcreteFactory)
    • 实现抽象工厂接口,负责创建具体的产品对象。
  3. 抽象产品(AbstractProduct)
    • 定义产品的公共接口。
  4. 具体产品(ConcreteProduct)
    • 实现抽象产品接口,表示具体的产品。
  5. 客户端(Client)
    • 通过抽象工厂来使用具体产品,不关心具体产品的实现。

示例代码:跨平台 UI 工具库

问题背景

假设需要开发一个跨平台的 UI 工具库,该工具库需要支持两种操作系统(Windows 和 MacOS),每个操作系统都有自己的按钮和复选框样式。我们可以使用抽象工厂模式来解决。


实现代码

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

// 抽象产品:复选框
interface CheckBox {
    void render(); // 复选框渲染方法
}

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

// 具体产品:Windows 风格复选框
class WindowsCheckBox implements CheckBox {
    @Override
    public void render() {
        System.out.println("渲染 Windows 风格的复选框");
    }
}

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

// 具体产品:MacOS 风格复选框
class MacCheckBox implements CheckBox {
    @Override
    public void render() {
        System.out.println("渲染 MacOS 风格的复选框");
    }
}

// 抽象工厂
interface UIFactory {
    Button createButton();   // 创建按钮
    CheckBox createCheckBox(); // 创建复选框
}

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

    @Override
    public CheckBox createCheckBox() {
        return new WindowsCheckBox();
    }
}

// 具体工厂:MacOS 工厂
class MacFactory implements UIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public CheckBox createCheckBox() {
        return new MacCheckBox();
    }
}

// 客户端
public class AbstractFactoryExample {
    public static void main(String[] args) {
        // 使用 Windows 工厂
        UIFactory windowsFactory = new WindowsFactory();
        Button windowsButton = windowsFactory.createButton();
        CheckBox windowsCheckBox = windowsFactory.createCheckBox();
        windowsButton.render();
        windowsCheckBox.render();

        // 使用 MacOS 工厂
        UIFactory macFactory = new MacFactory();
        Button macButton = macFactory.createButton();
        CheckBox macCheckBox = macFactory.createCheckBox();
        macButton.render();
        macCheckBox.render();
    }
}

输出结果:

渲染 Windows 风格的按钮
渲染 Windows 风格的复选框
渲染 MacOS 风格的按钮
渲染 MacOS 风格的复选框

抽象工厂模式的优点:

  1. 分离具体类
    • 客户端通过抽象工厂创建产品,而无需关心具体产品的类名和实现细节。
  2. 产品族一致性
    • 保证同一个工厂生产的产品属于同一产品族,符合设计要求。
  3. 开放-关闭原则
    • 新增产品族时,只需添加新的具体工厂类,无需修改现有代码。

抽象工厂模式的缺点:

  1. 复杂性增加
    • 引入较多的类和接口,增加了代码的复杂性。
  2. 难以扩展产品种类
    • 如果需要新增产品种类,需要修改抽象工厂接口及所有具体工厂,违反了开闭原则。

抽象工厂模式的适用场景:

  1. 需要创建一系列相关产品,并希望确保它们属于同一个产品族(例如跨平台 UI)。
  2. 系统需要提供多种配置或变体,客户端不需要了解具体实现。
  3. 希望通过接口来隔离具体类,从而实现产品的可替换性。

抽象工厂模式在跨平台开发、框架设计等场景中非常常见,比如 Java 的 javax.swingjavax.awt 就应用了该模式。

posted @   庞某人  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示