一、场景描述

接《Java设计模式(一)工厂模式》https://www.cnblogs.com/mahongbiao/p/8618970.html

工厂模式有一缺点,就是破坏了类的封闭性原则。例如,如果需要增加Word文件的数据采集,此时按以下步骤操作:

  1. 创建Word文件数据采集类,实现仪器数据采集接口;
  2. 修改仪器数据采集工厂类,增加Word文件数据采集类的工厂方法;
  3. 调用工厂类的word文件方法;

步骤2修改了工厂类,如果每增加一实现类都需要修改工厂类,那么这样就不合理了。

解决办法是使用抽象工厂类,为每一个实现类都创建其工厂类,并增加工厂接口,使各工厂类实现该接口。

使用抽象工厂后,上述步骤更改为:

  1. 创建Word文件数据采集类,实现仪器数据采集接口;
  2. 创建Word文件数据采集类的工厂类,该类实现工厂接口,接口方法创建Word文件数据采集类;
  3. 获取Word文件数据采集类的工厂类对象,并调用工厂接口方法,创建类对象,然后调用其方法。

修改后,由于对工厂类进行了抽象,定义了工厂接口,因此新增实现类时不再需要修改原有代码,不破坏原有实现。

如下图所示:

二、示例代码

仪器数据采集接口:

  1. package lims.designpatterndemo.abstractfactorydemo;
  2.  
  3. public interface EquipmentDataCapture {
  4. public String capture(String filePath);
  5. }

PDF文件采集类:

  1. package lims.designpatterndemo.abstractfactorydemo;
  2.  
  3. public class PdfFileCapture implements EquipmentDataCapture{
  4.  
  5. @Override
  6. public String capture(String filePath) {
  7. return "PDF file content";
  8. }
  9. }

Excel文件采集类:

  1. package lims.designpatterndemo.abstractfactorydemo;
  2.  
  3. public class ExcelFileCapture implements EquipmentDataCapture{
  4.  
  5. @Override
  6. public String capture(String filePath) {
  7. return "Excel File Content";
  8. }
  9. }

抽象工厂,即工厂接口:

  1. package lims.designpatterndemo.abstractfactorydemo;
  2.  
  3. public interface EquipmentDataCaptureFactory {
  4. public EquipmentDataCapture getCapture();
  5. }

PDF文件采集工厂类:

  1. package lims.designpatterndemo.abstractfactorydemo;
  2.  
  3. public class PdfFileCaptureFactory implements EquipmentDataCaptureFactory {
  4.  
  5. @Override
  6. public EquipmentDataCapture getCapture() {
  7. return new PdfFileCapture();
  8. }
  9. }

Excel文件采集工厂类:

  1. package lims.designpatterndemo.abstractfactorydemo;
  2.  
  3. public class ExcelFileCaptureFactory implements EquipmentDataCaptureFactory {
  4.  
  5. @Override
  6. public EquipmentDataCapture getCapture() {
  7. return new ExcelFileCapture();
  8. }
  9. }

调用示例:

  1. package lims.designpatterndemo.abstractfactorydemo;
  2.  
  3. public class AbstractFactoryDemo {
  4.  
  5. public static void main(String[] args) {
  6. EquipmentDataCaptureFactory facotry = new PdfFileCaptureFactory();
  7. facotry = new ExcelFileCaptureFactory();
  8. EquipmentDataCapture capture = facotry.getCapture();
  9. String fileContent = capture.capture("");
  10. System.out.println(fileContent);
  11. }
  12. }

Java设计模式(二)抽象工厂模式的更多相关文章

  1. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  2. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  3. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  4. Java 设计模式之抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  5. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  6. Java设计模式(3)——抽象工厂模式

    抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象. 一.产品族和产品等级结构 为 ...

  7. [java] java 设计模式(2):抽象工厂模式(Abstract Factory)

    工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...

  8. java设计模式之抽象工厂模式学习

    工厂模式有个问题就是,类的创建依赖工厂.要想增加一个工厂类,就要修改原来的代码,这违背了闭包原则.所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的 ...

  9. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  10. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

随机推荐

  1. Spring Boot 2.0(三):Spring Boot 开源软件都有哪些?

    2016年 Spring Boot 还没有被广泛使用,在网上查找相关开源软件的时候没有发现几个,到了现在经过2年的发展,很多互联网公司已经将 Spring Boot 搬上了生产,而使用 Spring ...

  2. openssl 生成证书基本原理

    摘自:http://blog.csdn.net/oldmtn/article/details/52208747 1. 基本原理 公司一个项目要进行交易数据传输,因为这个项目银行那边也是刚刚开始启动,所 ...

  3. 特殊权限SUIG、SGID、SBIT

    一.SetUID与SGID 只能用于二进制程序 执行者需要有该二进制程序的x权限 执行具有SUID权限的二进制程序,那么执行者将具有该二进制程序所有者的权限. 举例来说,/etc/passwd文件的权 ...

  4. C#实现二分法查找算法

    /// <summary> /// 二分法查找 /// </summary> /// <param name="arr"></param& ...

  5. 快速排序(QuickSort)

    1.算法思想    快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原 ...

  6. freemarker写select组件报错总结(三)

    1.错误描述 <html> <head> <meta http-equiv="content-type" content="text/htm ...

  7. The Eclipse executable launcher was unable to locate its companion launcher jar的解决方法

    大家都知道eclipse是免安装的,基本上解压就能用,但是笔者在解压后打开eclipse时遇到一个奇葩的问题,如题目所示. 在网上搜了半天,基本上都说的是:The Eclipse executable ...

  8. 电脑中安装多个jdk,eclipse的选择!

    以前自己写java程序的时候,没有用到什么高级的东西,所以没咋关注eclipse中jdk的版本问题: 但是随着学习的深入,难免会用到别人的项目,那么在导入别人的项目过程中就会发现时长有问题,而很多情况 ...

  9. visual studio编写C#代码时“未能从程序集.....中加载类型”和“找不到方法”的一种可能的解决办法

    编译前报错:$exception    {"未能从程序集"XSW.MySQLDAL, Version=1.0.0.0, Culture=neutral, PublicKeyToke ...

  10. Duplicate entry '0' for key 'PRIMARY'的一种可能的解决办法

    在MySQL设计好数据库往往数据库中插入数据的时候, 因为主键ID默认是不赋值的,只给其他项目赋值了,相关的SQL代码是这样的 StringBuilder strSql = new StringBui ...