抽象工厂模式AbstractFactory
简介
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
不同点
为了更清晰地理解抽象工厂模式,需要先引入两个概念:
产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是CPU,其子类有intelcpu、amdcpu,则抽象cpu与具体品牌的cpu之间构成了一个产品等级结构,抽象cpu是父类,而具体品牌的cpu是其子类。
产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如intel工厂生产的intelcpu、intel主板,intelcpu位于cpu产品等级结构中,intel主板位于主板产品等级结构中。
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。
当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。
类图
源码
cpu
public interface CPU {public void calculate(); }
intelcpu
public class IntelCPU implements CPU {private Integer pins;//cpu脚针数public IntelCPU(Integer pins) {this.pins = pins;}public void calculate() {System.out.println("Intel CPU 脚针数:" + pins);} }
amdcpu
public class AMDCPU implements CPU {private Integer pins;//cpu脚针数public AMDCPU(Integer pins) {this.pins = pins;}public void calculate() {System.out.println("AMD CPU 脚针数:" + pins);} }
主板
public interface MainBoard {public void installCPU(); }
intel主板
public class IntelMainBoard implements MainBoard {private Integer pins;public IntelMainBoard(Integer pins) {this.pins = pins;}public void installCPU() {System.out.println("Intel MainBoard 针脚数:"+pins);} }
amd主板
public class AMDMainBoard implements MainBoard {private Integer pins;public AMDMainBoard(Integer pins) {this.pins = pins;}public void installCPU() {System.out.println("AMD MainBoard 针脚数:" + pins);} }
工厂
public interface AbstractFactory {public CPU buyCPU();public MainBoard buyMainBoard();}
intel工厂
public class IntelFactory implements AbstractFactory {public CPU buyCPU() {return new IntelCPU(555);}public MainBoard buyMainBoard() {return new IntelMainBoard(555);} }
amd工厂
public class AMDFactory implements AbstractFactory {public CPU buyCPU() {return new IntelCPU(666);}public MainBoard buyMainBoard() {return new IntelMainBoard(666);} }
商家
public class Store {private CPU cpu = null;private MainBoard mainBoard = null;//组装pcpublic void setupPC(AbstractFactory factory) {this.cpu = factory.buyCPU();//买cputhis.mainBoard = factory.buyMainBoard();//买主板//买内存 机箱...this.cpu.calculate();this.mainBoard.installCPU();} }
测试
public static void main(String[] args) {Store store = new Store();AbstractFactory intelModel = new IntelFactory();store.setupPC(intelModel);//intel型号的电脑 /* Intel CPU 脚针数:555Intel MainBoard 针脚数:555*/}
适用场景
- 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
- 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
- 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。(比如:Intel主板必须使用Intel CPU、Intel
芯片组)
- 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
优点
- 分离接口和实现:客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
- 使切换和添加产品族变得容易:因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。我也可以再添加一个新的装机方案,一个新的产品族,都是很方便的。
缺点
不容易扩展新的产品等级,比如我要加一个硬盘、内存什么的。那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
Head First 设计模式(中文版)的示例:
码云地址:https://gitee.com/manusas/FactoryDP
我只是大自然的搬运工(thx):
hxxp://blog.csdn.net/zhshulin/article/details/38349211
hxxp://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html
转载于:https://www.cnblogs.com/manusas/p/7489893.html
抽象工厂模式AbstractFactory相关推荐
- 7.设计模式--抽象工厂模式(AbstractFactory模式)
1.定义 抽象工厂模式也是一种创建型模型,是对工厂的一种抽象,可以理解为生产工厂的工厂.不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责 ...
- 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型
1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...
- 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...
在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV, ...
- 设计模式之抽象工厂模式(Abstract Factory)摘录
面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...
- Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)
一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...
- java不同工厂生产不同电器_完整案例分析再加知识整合——艾特抽象工厂模式,超详细的...
抽象工厂模式 模式动机与定义 模式动机 产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产 ...
- java 工厂模式的写法_Java23种设计模式之抽象工厂模式
概述 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...
- 设计模式04_抽象工厂模式
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46440915 抽象工厂模式是对象的创建模式,它是工厂方法模 ...
- 抽象工厂模式_常用设计模式--抽象工厂模式
抽象工厂模式 定义 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 作用 在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的 ...
最新文章
- cap = cv2.VideoCapture(0).read()摄像头读取图片用法
- C++/C的文件结构
- Wince C++串口编程
- 处理您的请求时发生错误(Web Dynpro ABAP)
- 【atcoder】GP 2 [agc036C]
- Client does not support authentication protocol requested by server;
- C#事件中的两个参数(object sender,EventArgs e)
- C++学习之路 | PTA乙级—— 1039 到底买不买 (20 分)(精简)
- GitHub下载文件时缓慢的问题
- angular4点击事件监听_angular 事件广播和事件监听
- 震撼上市!北朝鲜语对话语音识别数据库
- XenApp简单部署
- cydia java_利用Cydia Substrate进行Android JAVA HOOK
- MathType中/英文版下载地址汇总(适用于Mathtype6.9)
- echarts 桑基图
- 大数据时代,数据实时同步解决方案的思考—最全的数据同步总结
- 有没有好记一点,c++ ,set容器遍历方法?(看过来)
- 安卓设置热点ssid和密码
- Flutter MethodChannel 原生通信导致的Reply already submitted问题
- WinCC 使用VBS脚本操作变量、控件总结
热门文章
- 推荐一个关于.NET平台数据结构和算法的好项目
- OpenCV+python:分水岭算法
- java mysql乐观锁_java乐观锁使用
- mysql8 mac 忘记密码_mac下 MySql 8.0.15忘记密码重置密码
- nginx php 大小写问题,Nginx实现url请求不区分大小写
- 反arp攻击软件_谈谈电子欺骗中的ARP欺骗
- python成绩统计_python学习-统计学生成绩-统计学生成绩
- 华三h3c交换机最详细的配置实例手册_华为/思科/华三基本命令对比
- c语言求跳水运动员成绩,跳水排名_C语言编程实例_C语言_最全面的网站教程
- datagrid底部显示水平滚动_DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强