设计模式系列(三)抽象工厂模式
发布日期:2021-07-23 22:22:38 浏览次数:2 分类:技术文章

本文共 1280 字,大约阅读时间需要 4 分钟。

先看两个概念:

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

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

角色:

  • AbstractFactory:抽象工厂
  • ConcreteFactory:具体工厂
  • AbstractProduct:抽象产品
  • Product:具体产品

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。

参考:

../_images/AbatractFactory.jpg

引用:的描述:

工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下: 工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。   一个抽象工厂类,可以派生出多个具体工厂类。   每个具体工厂类只能创建一个具体产品类的实例。抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   一个抽象工厂类,可以派生出多个具体工厂类。   每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。       区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。 抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。  对于java来说,你能见到的大部分抽象工厂模式都是这样的:---它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。这样A和B就是工厂,对应于抽象工厂;每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线

 

转载地址:https://blog.csdn.net/perfectnihil/article/details/91351950 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:设计模式系列(四)建造者模式
下一篇:设计模式系列(二)简单工厂模式与工厂方法模式

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月07日 03时11分47秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Java多线程的11种创建方式以及纠正网上流传很久的一个谬误 2019-04-27
JDK源码研究Jstack,JMap,threaddump,dumpheap的原理 2019-04-27
Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现 2019-04-27
javac编译原理和javac命令行的使用 2019-04-27
Unity使用UnityWebRequest实现本地日志上传到web服务器 2019-04-27
Unity使用RenderTexture实现裁切3D模型 2019-04-27
美术和程序吵架,原来是资源序列化格式设置不统一 2019-04-27
Unity iOS接SDK,定制UnityAppController 2019-04-27
Unity iOS接SDK前先要了解的知识(Objective-C) 2019-04-27
python遇到了‘module‘ object has no attribute ‘socket‘问题,大概率是这个原因 2019-04-27
记一次iOS闪退问题的定位:NSLog闪退 2019-04-27
Unity打开照相机与打开本地相册然后在Unity中显示照片(Android与iOS) 2019-04-27
无需接入SDK即可在Unity中获取经纬度(Android/iOS),告诉我你的坐标 2019-04-27
Unity获取系统信息SystemInfo(CPU、显卡、操作系统等信息) 2019-04-27
Unity中获取物体的尺寸(size)的三种方法 2019-04-27
Unity中的关节组件和绳子效果的实现 2019-04-27
Unity可视化编程插件: Bolt,可以像UE4的蓝图那样啦 2019-04-27
Android使用adb logcat时日志中文乱码问题,使用chcp 65001设置编码即可 2019-04-27
Android的.dex、.odex与.oat文件扫盲 2019-04-27
Unity移动应用如何在Bugly上查看崩溃堆栈 2019-04-27