抽象工厂设计模式解释

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

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

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

问题陈述:

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

解:

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

结构体:

抽象工厂设计模式

在上图中,创建的其他项是通过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上看看,毕竟相关公务人员也…

【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法

【BZOJ2004】[Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km。 作为公交车线路的规划者,小Z调查了市民的需求,决定…

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

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

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

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

java afconsole_Java ——基础语法

package myhello; //本类所在的包的路径import af.util.AfMath;//导入对应的类import java.util.Random;//导入随机数的类public classHelloWorld{public static voidmain(String[] args){int a 8;inti;int total 0;int score 80;System.out.println(a > 8);//空语句 只有…

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

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

js for 循环 添加tr td 算法

StringBuffer sbnew StringBuffer(); int n 5; sb.append("<tr>"); List<MenuBean> chs mb.getChildren(); for(int j 0; chs ! null && j < chs.size(); j){ MenuBean _mb2 chs.get(j); if (i % n 0)//被n整除&#xff0c;即有了n列之后…

1034. 二哥的金链

Description 一个阳光明媚的周末&#xff0c;二哥出去游山玩水&#xff0c;然而粗心的二哥在路上把钱包弄丢了。傍晚时分二哥来到了一家小旅店&#xff0c;他翻便全身的口袋也没翻着多少钱&#xff0c;而他身上唯一值钱的就是一条漂亮的金链。这条金链散发着奇异的光泽&#xf…

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

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

java中不能定义为变量名称_Java,“变量名”不能解析为变量

我使用Java使用Eclipse&#xff0c;出现此错误&#xff1a;"Variable name" cannot be resolved to a variable.使用此Java程序&#xff1a;public class SalCal {private int hoursWorked;public SalCal(String name, int hours, double hoursRate) {nameEmployee …

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

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

zookeeper集群 新手安装指南

Zookeeper集群的角色&#xff1a; Leader 和 follower &#xff08;Observer&#xff09;zk集群最好配成奇数个节点只要集群中有半数以上节点存活&#xff0c;集群就能提供服务本事例采用版本:zookeeper-3.4.5 虚拟机:zk1 zk2 zk3/****************************************…

Google Guava并发– ListenableFuture

在上一篇文章中&#xff0c;我介绍了使用番石榴库中com.google.common.util.concurrent包中的Monitor类。 在本文中&#xff0c;我将继续介绍Guava并发实用程序&#xff0c;并讨论ListenableFuture接口。 ListenableFuture通过添加接受完成侦听器的方法&#xff0c;从java.util…

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

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

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

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

es6常用基础合集

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

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

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

从Java程序生成QR码图像

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

LintCode-最长公共子串

给出两个字符串&#xff0c;找到最长公共子串。并返回其长度。 您在真实的面试中是否遇到过这个题&#xff1f; Yes例子 给出A“ABCD”&#xff0c;B“CBCE”&#xff0c;返回 2 注意 子串的字符应该连续的出如今原字符串中&#xff0c;这与子序列有所不同。标签 Expand 相关…

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

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