抽象工厂设计模式解释

抽象工厂设计模式是工厂设计模式的另一种形式。 这种模式可以被视为“超级工厂”或“工厂工厂”。

抽象工厂设计模式(属于“四人帮”的一部分)属于“创新设计模式”类别,它提供了一种封装一组具有公共链接的工厂的方法,而无需突出其具体类。 这就是工厂根据用户需求在运行时创建各种对象的全部内容。 客户仍然完全不知道(解耦)了从各个工厂获得的具体产品,客户只能访问简化的界面。

定义:
抽象工厂设计模式提供了一个接口,用于创建相关或相关对象的族,而无需指定其具体类。

问题陈述:

我们将考虑与服装工厂相同的先前示例,并对其进行扩展以理解抽象工厂的问题陈述。 考虑一家专门生产裤子和衬衫的服装工厂。 现在,作为著名零售品牌的母公司正进入小工具领域。 他们还计划扩大其工厂,在美国建立一个中心,在英国建立另一个中心。 客户端应该完全不知道对象是如何创建的。 我们可以用来解决此要求的最佳设计模式是什么?

解:

为了解决上述设计问题,我们将使用抽象工厂模式。 如前所述,这是超级工厂。 使用工厂方法模式无法有效解决上述问题,因为这涉及与母公司或受抚养人相关的多个工厂和产品。
注意:在设计模式中,摘要和接口可以使用相同的名称来引用。

结构体:

抽象工厂设计模式

在上图中,创建的其他项是通过AbstractFactory的具有createProductA()createProductB()方法的抽象附加层。 有多个ConcreteFactories可以实现AbstractFactory的方法。 客户端现在仅访问AbstractFactory接口。

另一部分是产品。 客户端现在访问不同的AbstractProduct接口AbstractProductAAbstractProductB 。 所有用于AbstractProducts的ConcreteProducts都是由ConcreteFactories( ConcreteFactory1ConcreteFactory2 )创建的,这是逻辑。

现在,让我们看一下我们现实生活中的GarmentFactory示例,它与Factory Method模式有什么区别。

抽象工厂示例

在上面的现实示例中,RetailFactory是AbstractFactory类,该类现在在美国和英国等不同位置拥有多个Concrete工厂(UKFactory和USFactory),专门致力于分别创建衬衫/笔记本电脑和裤子/手机等多种产品。 在此示例中,我们还创建了另一个名为FactoryMaker的其他类,该类从客户端中选择Factory,然后将作业相应地委派给适当的Factory类。 客户端完全不知道该处理的完成方式,并且仅引用RetailFactory接口以及GarmentType和GadgetType接口。 这种松散的耦合也有助于增加多个混凝土产品,而无需更改客户代码。

优点:

使用此模式,即使在运行时也可以在不更改客户端代码的情况下交换具体类。

退税:

主要缺点之一是额外的复杂性和在初始阶段编写代码。

你知道吗?
JEE中的数据访问对象使用(GoF)抽象工厂模式从RdbDAOFactory,XmlDAOFactory,OdbDAOFactory创建各种产品DAO。


有趣的一点:

  • 抽象工厂,构建器和原型可以在其实现中使用Singleton。 抽象工厂模式通常与工厂方法一起使用,但是也可以使用原型模式来实现,以提高性能并简化代码。
  • 抽象工厂可以用作Façade模式的替代方案,以隐藏平台特定的类
  • AbstractFactory类仅声明用于创建产品的接口。 实际的创建是ConcreteProduct类的任务,其中一个好的方法是为该系列的每个产品应用Factory Method设计模式。

抽象工厂和工厂方法模式之间的区别:

  • Factory Method模式向客户端公开了一种用于创建对象的方法,而在Abstract Factory的情况下,它们公开了可能由这些Factory方法组成的一系列相关对象。
  • 设计始于使用工厂方法(复杂程度较低,更易于自定义的子类激增),并随着设计人员发现需要更多灵活性的地方而向抽象工厂,原型或生成器(更灵活,更复杂)发展。
  • 工厂方法模式隐藏单个对象的构造,而抽象工厂方法则隐藏一系列相关对象的构造。 抽象工厂通常使用一组工厂方法来实现。


参考: 抽象工厂设计模式在Idiotechie博客上由我们的JCG合作伙伴 Mainak Goswami 解释 。

翻译自: https://www.javacodegeeks.com/2012/10/abstract-factory-design-pattern-explained.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

app账号退不出去_最新!多交的税可以退,同学,你今天退税了吗?

4.3 号 更新。1、有知友留言,已经收到退税了。2、部分地区陆续开放申报了,建议大家不要着急。3、大家耐心一点,该是你的就是你的,退税这个事多退少补,建议大家在白天上班时间去APP上看看,毕竟相关公务人员也…

课时77.序选择器(掌握)

CSS3中新增的选择器最具代表性的就是序选择器。 1.同级别的第几个 1. :first-child 选中同级别中的第一个标签 注意点:不区分类型 但是我们这里有一个注意点,如果我们在第一个p之前加一个h1,则第一个p就不变红了,因为我们…

Gulp——文件压缩和文件指纹

先看下文件指纹添加成功发布后的“成果”。 首先介绍下gulp的文件压缩(压缩css和js) (下面介绍的代码移步这里) 我的文件目录如下: (标红部分是生成的处理后的文件) 如何使用gulp,请…

Java 7:使用NIO.2进行文件过滤-第2部分

大家好。 这是使用NIO.2系列进行文件过滤的第2部分。 对于那些尚未阅读第1部分的人 ,这里有个回顾。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以执行与java.io相同的操作,以及许多出色的功能,例如&a…

课时76.兄弟选择器(掌握)

我们先来明确一点,什么是兄弟? 比如,head和body是兄弟,必须是同级关系,如果是嵌套关系,儿子,孙子则不可以。 1.相邻兄弟选择器 CSS2 作用:给指定选择器后面紧跟的那个选择器选中的…

24v开关电源维修技巧_康佳LED液晶彩电KPS+L1900C301电源板原理与维修

康佳液晶彩电采用的KPSL1900C3-01型电源板,编号为34007728,版本号为35015686集成电路采用FAN7530FSGM300FSFR1700组合方案,输出5.1VSB/4A、24V/4A、12V/4A电压。应用于康佳LED47IS988PD、LED42M11PD、LED46MS92DC、LED42IS988PDE、LED42X5000…

课时71.后代选择器(掌握)

1.什么是后代选择器? 作用:找到指定标签的所有后代标签,设置属性。 首先你要明确什么是后代? 你的儿子,孙子,重孙子等,只要有你的血脉的,都是你的后代。 我们先来举个例子 我们想…

java小球碰撞界面设计_JavaScript实现小球碰撞特效

JavaScript实现小球碰撞特效。类似自由落体运动。实现原理非常简单,就是动态的改变每个元素的坐标。使用radius属性将图片圆角化。使用left,top属性动态的改变小球的位置。碰撞反弹球,当碰撞到容器的边缘后,进行反弹,反…

es6常用基础合集

es6常用基础合集 在实际开发中,ES6已经非常普及了。掌握ES6的知识变成了一种必须。尽管我们在使用时仍然需要经过babel编译。 ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大。值得高兴的是,如果你熟悉ES5,学习ES6并不…

java接口开发_如果你想学好Java,这些你需要了解

01基本知识  在学习Java之前,您需要了解计算机的基本知识,然后再学习Java。同时,您需要熟悉DOS命令、Java概述、JDK环境安装配置、环境变量配置。JDK和环境变量配置完成后,就可以编写Java程序了。02编程格式  此时&#xff0c…

从Java程序生成QR码图像

如果您精通技术和小工具,则必须了解QR码。 这些天,到处都可以找到它-在博客,网站,甚至在某些公共场所。 这在移动应用程序中非常流行,在移动应用程序中,您可以使用QR Code扫描仪应用程序扫描QR Code&#x…

课时67.标签选择器(掌握)

通过上节课的学习我们明白了如何通过十六进制来表示颜色 例如:红色的几种表示方法 我们发现在学习CSS当中的一些属性的时候,它都有一些套路 只要知道属性的名称,属性有什么作用,它有哪些取值,这个属性有什么注意点 …

Java 7:使用NIO.2进行文件过滤-第1部分

NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以执行与 java.io以及许多出色的功能,例如:访问文件元数据和监视目录更改等。 显然,由于向后兼容,java.io包不会消失,但是我们鼓励为…

课时66.颜色控制属性下(理解)

今天来讲解十六进制控制属性的方法,其实用十六进制表示的方式本质就是rgb,只不过它们的格式不一样而已,十六进制中是通过每两位表示一种颜色的方式来给颜色赋值。 如 #FF0000 FF----r 00----g 00----b 修改前两位相当于修改rgb中的第一…

课时57.HTML被废弃的标签(掌握)

1.为什么HTML中有一部分标签会被废弃&#xff1f; 因为当前HTML中的标签只有一个作用&#xff0c;就是用来添加语义&#xff0c;而早期的HTML标签中有一部分标签是没有语义的 有一部分标签是用来修改样式的 所以这部分标签就被淘汰了 <br><hr><font> <…

课时55.详情和概要标签(理解)

1.什么是详情和概要标签&#xff1f; 作用&#xff1a;利用summary标签来描述概要信息&#xff0c;利用details标签来描述详情信息 默认情况下是折叠展示&#xff0c;想看见详情必须点击 格式&#xff1a; <details> <summary>概要信息</summary> 详情信…

课时53.video标签(掌握)

这节课来学习一下html5中新增的标签&#xff0c;我们先来看一下&#xff0c;html5中新增了哪些标签&#xff1f; 打开W3school的网页&#xff0c;点击参考手册中的HTML/HTML5标签&#xff0c;有一个按字母顺序排列的标签&#xff0c;但凡标签后面带有5标记的&#xff0c;都是h…

Canvas制作的下雨动画

简介 在codepen上看到一个Canvas做的下雨效果动画&#xff0c;感觉蛮有意思的。就研究了下&#xff0c;这里来分享下&#xff0c;实现技巧。效果可以见下面的链接。 霓虹雨: http://codepen.io/natewiley/full/NNgqVJ/ 效果截图&#xff1a; Canvas动画基础 大家都知道&…

在Eclipse中有效使用JUnit

最近&#xff0c;我被卷入了讨论1和一些受感染的同伴2&#xff0c;他们关于我们如何在Eclipse IDE中使用JUnit 。 令人惊讶的是&#xff0c;对话带来了并非所有人都知道的一些“技巧”。 这使我有了写这篇文章的想法&#xff0c;总结了我们的演讲。 谁知道–也许有人也有新事物…

jquery文件上传控件 Uploadify

基于jquery的文件上传控件&#xff0c;支持ajax无刷新上传&#xff0c;多个文件同时上传&#xff0c;上传进行进度显示&#xff0c;删除已上传文件。 要求使用jquery1.4或以上版本&#xff0c;flash player 9.0.24以上。 有两个版本&#xff0c;一个用flash,一个是html5。html5…