设计模式——抽象工厂模式(Abstract Factory Pattern)

这篇具有很好参考价值的文章主要介绍了设计模式——抽象工厂模式(Abstract Factory Pattern)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

       抽象工厂模式的基本思想是将一些相关的产品组成一个“产品族”,由同一个工厂统一生产。在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂中只有一个或者一组重载的工厂方法。但是有时候我们希望一个工厂可以提供多个产品对象,而不是单一的产品对象,如一个电器工厂,它可以生产电视机、电冰箱、空调等多种电器,而不是只生产某一种电器。为了更好地理解抽象工厂模式,我们先引入两个概念:

       (1) 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

       (2) 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。

       产品等级结构与产品族示意图如图所示:

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

       当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构、属于不同类型的具体产品时就可以使用抽象工厂模式。抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率。抽象工厂模式示意图如下图所示:

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

       在上图中,每一个具体工厂可以生产属于一个产品族的所有产品,例如生产颜色相同的正方形、圆形和椭圆形,所生产的产品又位于不同的产品等级结构中。如果使用工厂方法模式,上图所示结构需要提供15个具体工厂,而使用抽象工厂模式只需要提供5个具体工厂,极大减少了系统中类的个数。

      抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族,抽象工厂模式结构如图所示:

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

在抽象工厂模式结构图中包含如下几个角色:

       ● AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。

       ● ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。

       ● AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。

       ● ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

简单实现

       以生产各种颜色的桌椅为例,桌子、椅子为一组产品族,而每种家具的颜色作为产品等级(类似于不同颜色的烤漆房)。

       在抽象工厂中声明了多个工厂方法,用于创建不同类型的产品,抽象工厂可以是接口,也可以是抽象类或者具体类,其典型代码如下所示:

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

       具体工厂实现了抽象工厂,每一个具体的工厂方法可以返回一个特定的产品对象,而同一个具体工厂所创建的产品对象构成了一个产品族。对于每一个具体工厂类,其典型代码如下所示:

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

编写测试类并运行:

设计模式——抽象工厂模式(Abstract Factory Pattern),设计模式,设计模式,抽象工厂模式

       当我们需要生产蓝色家具的时候,不需要更改抽象工厂,只需要增加蓝色工厂类以及两个具体蓝色产品即可,符合“开闭原则”,但是当需要增加一个新产品的时候,例如凳子,就需要修改抽象工厂及所有的具体工厂,违背了“开闭原则”。

       与工厂方法模式一样,抽象工厂模式也可为每一种产品提供一组重载的工厂方法,以不同的方式对产品对象进行创建。

总结

       在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦(即新增一种各个产品等级结构的产品),抽象工厂模式的这种性质称为“开闭原则”的倾斜性。“开闭原则”要求系统对扩展开放,对修改封闭,通过扩展达到增强其功能的目的,对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:

       (1) 增加产品族:对于增加新的产品族,抽象工厂模式很好地支持了“开闭原则”,只需要增加具体产品并对应增加一个新的具体工厂,对已有代码无须做任何修改。

       (2) 增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,违背了“开闭原则”。

       正因为抽象工厂模式存在“开闭原则”的倾斜性,它以一种倾斜的方式来满足“开闭原则”,为增加新产品族提供方便,但不能为增加新产品结构提供这样的方便,因此要求设计人员在设计之初就能够全面考虑,不会在设计完成之后向系统中增加新的产品等级结构,也不会删除已有的产品等级结构,否则将会导致系统出现较大的修改,为后续维护工作带来诸多麻烦。

       抽象工厂模式是工厂方法模式的进一步延伸,由于它提供了功能更为强大的工厂类并且具备较好的可扩展性,在软件开发中得以广泛应用,尤其是在一些框架和API类库的设计中,例如在Java语言的AWT(抽象窗口工具包)中就使用了抽象工厂模式,它使用抽象工厂模式来实现在不同的操作系统中应用程序呈现与所在操作系统一致的外观界面。抽象工厂模式也是在软件开发中最常用的设计模式之一。

1. 主要优点

       (1) 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

        (2) 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。

       (3) 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。

2. 主要缺点

       抽象工厂模式的主要缺点如下:

       增加新的产品等级结构(新产品)麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。

3. 适用场景

       在以下情况下可以考虑使用抽象工厂模式:

       (1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。

       (2) 系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。

       (3) 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,此时具有一个共同的约束条件:操作系统的类型。

       (4) 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。文章来源地址https://www.toymoban.com/news/detail-780217.html

到了这里,关于设计模式——抽象工厂模式(Abstract Factory Pattern)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 抽象工厂模式(Abstract Factory Pattern)

    回顾工厂方法设计模式的不足:具体产品增加时,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度 产品等级结构:产品等级结构即产品的继承结构,即抽象产品与具体产品 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构

    2024年02月02日
    浏览(37)
  • 抽象工厂模式-Abstract Factory Pattern

    原文地址:https://jaune162.blog/design-pattern/abstract-factory-pattern/ 首先我们由一个实际问题来引出抽象工厂模式。 考虑这样一个场景,系统中需要向OSS上传文件,以及通过OSS下载文件。而在系统中有不同的业务在使用这两个功能。如下图: 伪代码如下

    2024年02月20日
    浏览(36)
  • 《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)

    在不具体指定产品类的情况下,为相互关联的产品簇或产品集提供创建接口,并向客户隐藏具体产品创建的细节或表示的对象。 AbstractFactory(抽象工厂):它声明了一组用于创建产品的方法,每一个方法对应一种产品。 ConcreteFactory(具体工厂):它实现了在抽象工厂中声明

    2024年02月14日
    浏览(43)
  • 抽象工厂模式(Abstract Factory)

    抽象工厂是一种 创建型设计模式 ,它能 创建一系列相关的对象,而无需指定其具体类 。 1. 问题 假设你正在开发一款家具商店模拟器。你的代码中包括一些类,用于表示: 一系列相关产品,例如椅子(Chair)、沙发(Sofa)和咖啡桌(CoffeeTable) 系列产品的不同变体,例如你

    2024年02月11日
    浏览(36)
  • 设计模式--工厂模式(Factory Pattern)

    工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象,而无需暴露对象的实例化逻辑。 工厂模式的主要目标是解耦对象的创建和使用,以及

    2024年02月10日
    浏览(35)
  • 大话设计模式——2.简单工厂模式(Simple Factory Pattern)

    定义:又称静态工厂方法,可以根据参数的不同返回不同类的实例,专门定义一个类(工厂类)来负责创建其他类的实例可通过类名直接调用,被创建的实例通常具有共同的父类。 UML图: 例子: 计算器中的加减乘除,可将不同的运算看成不同的对象,通过工厂类进行构建,

    2024年02月22日
    浏览(43)
  • Factory Method Pattern 工厂方法模式简介与 C# 示例【创建型】【设计模式来了】

    一句话解释:   实体类和工厂类均为单独实现,不影响已实现的类,方便扩展。 工厂方法模式(Factory Method Pattern)是一种创建型模式,它允许客户端通过工厂方法来创建对象,而不是直接使用构造函数。这样可以让客户端代码更加灵活,同时保持实现的独立性。工厂方法

    2024年02月06日
    浏览(41)
  • Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】

    一句话解释:   客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类。 简单工厂模式(Simple Factory Pattern)是日常开发中常用的设计模式。其是一种简单的创建型模式,它通过一个工厂类来创建对象,客户端只需要知道如何使用工厂类,而不需要知道对

    2024年02月06日
    浏览(50)
  • Abstract Factory 抽象工厂

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。 其中: AbstractFactory声明一个创建抽象产品对象的操作接口。 ConcreteFactory实现创建具体产品对象的操作。 AbstractProduct为一类产品对象声明一个接口。 ConcreteProduct定义一个将被相应的具体工厂创建的

    2024年04月11日
    浏览(40)
  • 设计模式-工厂模式Factory

    一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。 简单工厂叫作静态工厂方法模式(Static Factory Method Pattern) 现在有一个场景,需要一个资源加载器,要 根据不用的url 进行资源加载,但是如果我们将 所有的加载实现代码全部封装在了一个

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包