首页 > 其他分享 >抽象工厂模式

抽象工厂模式

时间:2022-10-29 19:34:40浏览次数:47  
标签:return 创建 模式 工厂 抽象 new public

概述

《设计模式》中对抽象工厂(Abstract Factory) 模式的意图描述如下:

提供一个接口以创建一系列相关或相互依赖的对象,而无需指定它们具体的类

一般抽象工厂中的类结构如下图所示:

AbstractFactory.png

每个组件的介绍如下:

  • AbstractFactory:一个创建抽象产品对象的接口
  • ConcreateFactory:创建具体产品的实现类
  • AbstractProduct:对一类产品的统一抽象
  • ConcreateProduct:实际的产品对象
  • Client:用于访问 AbstractFactoryAbstractProduct 的客户端对象

具体示例

假设现在有一个需求,需要能够灵活地创建多种类型的风格 UI 组件(如菜单、滚动条等),首先我们需要定一个抽象接口,规定相关的创建行为:

public interface UIFactory {
    Menu createMenu(); // 创建 UI 的菜单栏组建
    ScrollBar createScrollBar(); // 创建对滚动条组建
    Window createWindow(); // 创建窗口组件
}

现在访问该 UI 工厂的对象 Client 是另一个与之相互隔离的对象,比如说一个文本编辑器对象,需要通过该 UI 工厂对象在自己的领域中添加对应的 UI 组件:

public class TextEditor {
    public TextEditor createTextEditor(UIFactory factory) {
        TextEditor editor = new TextEditor();
        editor.setMenu(factory.createMenu());
        editor.setScrollBar(factory.createScrollBar());
        editor.setWindow(factory.createWindow());
        return editor;
    }
}

现在,具体的文本编辑器的创建已经很好地处理了和 UI 组件之间的依赖关系,使得系统之间的耦合程度大大减小

如果现在需要使得文本编辑器的风格是暗色的,那么我们只需要定义一个实现了 UIFactory 的暗色工厂,将它传给 TextEditor 进行创建即可:

public class BlackUIFactory implements UIFactory {
    @Override
    public Menu createMenu() {return new BalckMenu();}
    
    @Override
    public ScrollBar createScrollBar() {return new BlackScrollBar();}
    
    @Override
    public Window createWindow() {return new BlackWindow();}
}

而随着时间的推移,可能会希望能够提供极简风格的组件,那么我们同样可以横向拓展丰富系统的功能:

public class SimpleUIFactory implements UIFactory {
    @Override
    public Menu createMenu() {return new SimpleMenu();}
    
    @Override
    public ScrollBar createScrollBar() {return new SimpleScrollBar();}
    
    @Override
    public Window createWindow() {return new SimpleWindow();}
}

当需要替换不同风格的组件时,只需要传入不同的 UIFactory 实例即可,而无需关心实际的实例内容

总结

抽象工厂模式存在以下的一些优点:

  • 抽象工厂分离了具体的类,客户端只需要知道抽象接口即可实现操作实例的逻辑,降低了系统的耦合程度
  • 使得产品系列的交换变得容易。从上面的示例中我们可以看到,当希望修改组件的风格时,只需要改变传入的具体工厂实例
  • 有利于产品的一致性。当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,而通过 AbstractFactory 则很容易实现这一点

当然,使用抽象工厂模式也存在一些不足,最大的不足之处便是不支持纵向扩展,即一个抽象工厂很难生产新的产品。这是因为 AbstractFactory 接口确定一个可以创建的产品集合,而如果需要生产新的产品的话,将会涉及到所有子类的改动


参考:

[1] 《设计模式—可复用面向对象基础》

标签:return,创建,模式,工厂,抽象,new,public
From: https://www.cnblogs.com/FatalFlower/p/16839446.html

相关文章

  • 【JS ES6】use strict 严格模式
    目录​​什么是严格模式​​​​启用严格模式​​​​严格模式中的变化​​由于JavaScript语法不够严谨,一直被人们所诟病,例如在使用一个变量时,可以不使用var关键字来提......
  • JQueue一个实现Outbox模式的库
       为了提高系统吞吐率,也就是提高生产效率,核心观点如下,系统设计也是如此    在微服务或任何其他基于事件的架构(event-driven-architecture)中,在一些用例中,一个......
  • 状态模式
    一、前言自然界所有事物都有自己的存在状态,比如水有固态、液态、气态,三种不同的心态有着完全不一样的外在特性,我们将事物所处的某一种形态称为状态。二、状态模式概念状态模......
  • 设计模式之装饰模式
    概述装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为。在现实生活中,这种情况也到处存在,例如一张照片,可以不改变照片本身,给它增加一个相框,使得它具有......
  • 【Vue2.0学习】—路由的两种工作模式(六十六)
    【Vue2.0学习】—路由的两种工作模式(六十六)对于一个url来说,什么是hash值?#以及后面的内容就是hash值hash值不会包含在HTTP请求中,即:hash值不会带给服务器hash模式:地址中永远带......
  • 设计模式九(命令模式、解释器模式、迭代器模式、中介者模式)
    命令模式(CommandPattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传......
  • 5 访问修饰符 抽象类 抽象成员 密封类 静态类 扩展方法 命名约定
    目录访问修饰符抽象成员抽象类密封类静态类扩展方法命名约定访问修饰符所有声明在类中的成员都是可见的,无论他们的访问性如何。继承的成员对派生的成员可以是可见的,也......
  • C++ primer笔记 7.1 定义抽象数据类型
    7.1定义抽象数据类型structSales_data{std::stringbookNo;unsignedunits_sold=0;doublerevenue=0.0;std::stringisbn()const{returnboo......
  • 实现云原生模式​
    云原生基础架构由应用程序来维护,而云原生应用则由基础架构来维护,两者密不可分。这就要求基础架构和应用程序设计必须是简单的。如果一个应用程序比较复杂,则应该采用微服务模......
  • 实现云原生模式
    云原生基础架构由应用程序来维护,而云原生应用则由基础架构来维护,两者密不可分。这就要求基础架构和应用程序设计必须是简单的。如果一个应用程序比较复杂,则应该采用微服务......