Java设计模式(二)抽象工厂模式
一、场景描述
接《Java设计模式(一)工厂模式》https://www.cnblogs.com/mahongbiao/p/8618970.html
工厂模式有一缺点,就是破坏了类的封闭性原则。例如,如果需要增加Word文件的数据采集,此时按以下步骤操作:
- 创建Word文件数据采集类,实现仪器数据采集接口;
- 修改仪器数据采集工厂类,增加Word文件数据采集类的工厂方法;
- 调用工厂类的word文件方法;
步骤2修改了工厂类,如果每增加一实现类都需要修改工厂类,那么这样就不合理了。
解决办法是使用抽象工厂类,为每一个实现类都创建其工厂类,并增加工厂接口,使各工厂类实现该接口。
使用抽象工厂后,上述步骤更改为:
- 创建Word文件数据采集类,实现仪器数据采集接口;
- 创建Word文件数据采集类的工厂类,该类实现工厂接口,接口方法创建Word文件数据采集类;
- 获取Word文件数据采集类的工厂类对象,并调用工厂接口方法,创建类对象,然后调用其方法。
修改后,由于对工厂类进行了抽象,定义了工厂接口,因此新增实现类时不再需要修改原有代码,不破坏原有实现。
如下图所示:

二、示例代码
仪器数据采集接口:
package lims.designpatterndemo.abstractfactorydemo;
public interface EquipmentDataCapture {
public String capture(String filePath);
}
PDF文件采集类:
package lims.designpatterndemo.abstractfactorydemo;
public class PdfFileCapture implements EquipmentDataCapture{
@Override
public String capture(String filePath) {
return "PDF file content";
}
}
Excel文件采集类:
package lims.designpatterndemo.abstractfactorydemo;
public class ExcelFileCapture implements EquipmentDataCapture{
@Override
public String capture(String filePath) {
return "Excel File Content";
}
}
抽象工厂,即工厂接口:
package lims.designpatterndemo.abstractfactorydemo;
public interface EquipmentDataCaptureFactory {
public EquipmentDataCapture getCapture();
}
PDF文件采集工厂类:
package lims.designpatterndemo.abstractfactorydemo;
public class PdfFileCaptureFactory implements EquipmentDataCaptureFactory {
@Override
public EquipmentDataCapture getCapture() {
return new PdfFileCapture();
}
}
Excel文件采集工厂类:
package lims.designpatterndemo.abstractfactorydemo;
public class ExcelFileCaptureFactory implements EquipmentDataCaptureFactory {
@Override
public EquipmentDataCapture getCapture() {
return new ExcelFileCapture();
}
}
调用示例:
package lims.designpatterndemo.abstractfactorydemo;
public class AbstractFactoryDemo {
public static void main(String[] args) {
EquipmentDataCaptureFactory facotry = new PdfFileCaptureFactory();
facotry = new ExcelFileCaptureFactory();
EquipmentDataCapture capture = facotry.getCapture();
String fileContent = capture.capture("");
System.out.println(fileContent);
}
}
Java设计模式(二)抽象工厂模式的更多相关文章
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- java设计模式之抽象工厂模式
上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...
- Java 设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- java设计模式(三)--抽象工厂模式
转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...
- Java设计模式(3)——抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象. 一.产品族和产品等级结构 为 ...
- [java] java 设计模式(2):抽象工厂模式(Abstract Factory)
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...
- java设计模式之抽象工厂模式学习
工厂模式有个问题就是,类的创建依赖工厂.要想增加一个工厂类,就要修改原来的代码,这违背了闭包原则.所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
随机推荐
- Pandoc将markdown转换为word
markdown转换为word的指令 直接将markdown转换为word pandoc -f markdown -t docx ./test.md -o test.docx 关于markdown转为 ...
- Scrum方法论
产品负责人: 代表客户或未来游戏玩家.产品负责人需要确保所有有趣的功能都能在游戏中实现,还负责对游戏完整观感的理解. Scrum主管: 代表理性思维.需要主持每日Scrum会议,并确保每个人都在执行任 ...
- Navicat远程连接阿里云服务器的mysql
问题描述: 本机为win10,mysql安装在阿里云(Ubuntu系统)上,本机使用Navicat远程连接mysql,遇到一些坑,求助于阿里云,最终解决,特此记录一下! 安装mysql sudo ap ...
- 【其他】Objective-C 内存管理学习总结
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/OC_CG.html 最近学习了Objective-C语言(以下简称OC),其他的都还好,唯有它的内存管理让我不知所 ...
- linux下的framebuffer显示图片
void showbmp2() { int x,y; unsigned char *p; int index=0; struct fb_var_screen ...
- 一句Python,一句R︱数据的合并、分组、排序、翻转
先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句python,对应写一句R. python中的numpy模块相当于R中的matirx矩 ...
- 一种在BIOS中嵌入应用程序的方法及实现
本文针对Award公司开发的计算机系统BIOS提出了一种嵌入应用程序的方法,其基本原理对别的品牌的BIOS也一样适用,仅需稍加修改.文中作者给出并讨论一个完整的例子程序,该程序已经通过实验验证. 正 ...
- FindBugs找到错误(一)
FindBugs找到错误(一) 错误类型: SBSC_USE_STRINGBUFFER_CONCATENATION
- zTree实现地市县三级级联报错(三)
zTree实现地市县三级级联报错(三) 1.具体报错如下 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] ...
- Linux显示用户注册名
Linux显示用户注册名 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ finger -s Login Name Tty Idle Login Time Of ...