首页 > Java > java教程 > 正文

抽象工厂模式

Patricia Arquette
发布: 2024-11-21 04:59:10
原创
106 人浏览过

什么是抽象工厂模式?

抽象工厂模式是一种创建模式,它提供了一个接口,用于创建相关或依赖对象系列,而无需指定它们的具体类。

什么时候使用它?

当您拥有一系列对象时,其中一个系列中的对象需要协同工作,但仍希望将具体产品及其工厂与客户端代码解耦,请使用抽象工厂模式。

问题

我们计划开发一个简单的主题应用程序,客户可以根据自己的喜好选择浅色或深色 UI。我们准备三个组件Button、Menu 和 Toolbar。每个组件都有浅色和深色风格的外观。
显然,我们希望确保所有浅色主题组件一起工作(我们不想同时显示浅色按钮、深色菜单和浅色工具栏)。此外,我们希望将来仍有可能添加其他主题,例如“高对比度”主题。

解决方案

Abstract Factory Pattern

  1. 主题应用
    这是我们的客户。构造函数接收具体工厂作为参数,然后 createComponents() 将创建相应的组件。客户端仅依赖于抽象工厂和抽象产品。

  2. 主题工厂
    所有具体主题的界面。

  3. 具体主题工厂
    提供 ThemeFactory 方法的实际实现。这些混凝土工厂生产混凝土产品。

  4. 产品界面
    组件接口。

  5. 混凝土产品
    定义特定行为。

结构

Abstract Factory Pattern

Java 中的实现

public interface Button {

    void render();
}
登录后复制
public class DarkButton implements Button{

    @Override
    public void render() {
        System.out.println("Successfully render a dark button");
    }
}
登录后复制
public class LightButton implements Button {

    @Override
    public void render() {
        System.out.println("Successfully render a light button");
    }
}

登录后复制

您可以用同样的方式编写菜单和工具栏组件的代码。

public interface ThemeFactory {

    Button createButton();

    Menu createMenu();

    Toolbar createToolbar();
}
登录后复制
public class DarkThemeFactory implements ThemeFactory {

    @Override
    public Button createButton() {
        return new DarkButton();
    }

    @Override
    public Menu createMenu() {
        return new DarkMenu();
    }

    @Override
    public Toolbar createToolbar() {
        return new DarkToolbar();
    }
}
登录后复制
public class LightThemeFactory implements ThemeFactory {

    @Override
    public Button createButton() {
        return new LightButton();
    }

    @Override
    public Menu createMenu() {
        return new LightMenu();
    }

    @Override
    public Toolbar createToolbar() {
        return new LightToolbar();
    }
}
登录后复制
// This is our client code, notice client sees neither concrete products nor concrete factories
public class ThemeApplication {

    private ThemeFactory themeFactory;
    private Button button;
    private Menu menu;
    private Toolbar toolbar;

    public ThemeApplication(ThemeFactory factory) {
        themeFactory = factory;
        createComponents();
    }

    public void createComponents() {
        button = themeFactory.createButton();
        menu = themeFactory.createMenu();
        toolbar = themeFactory.createToolbar();
    }

    public void renderComponents() {
        button.render();
        menu.render();
        toolbar.render();
    }
}
登录后复制
public class ThemeApplicationTestDrive {

    public static void main (String[] args) {
        ThemeFactory darkFactory = new DarkThemeFactory();
        ThemeApplication app1 = new ThemeApplication(darkFactory);
        app1.renderComponents();
        System.out.println("*******************");

        ThemeFactory lightFactory = new LightThemeFactory();
        ThemeApplication app2 = new ThemeApplication(lightFactory);
        app2.renderComponents();
    }
}
登录后复制

输出:

Successfully render a dark button
Successfully render a dark menu
Successfully render a dark toolbar
*******************
Successfully render a light button
Successfully render a light menu
Successfully render a light toolbar
登录后复制

陷阱

  • 实现起来比工厂模式更复杂。
  • 添加新产品需要更改抽象工厂和具体工厂。

与工厂模式的比较

  • 工厂模式将具体产品与客户端代码解耦,而抽象工厂模式隐藏了具体工厂和具体产品。
  • 工厂模式适用于一种产品及其子类。相比之下,当多个产品需要协同工作时,抽象工厂模式适合。

您可以在这里查看所有设计模式的实现。
GitHub 存储库


附注
我是刚开始写科技博客,如果您对我的写作有什么建议,或者有任何困惑的地方,请留言!
感谢您的阅读:)

以上是抽象工厂模式的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板