欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-06 11:44:04
一、场景描述 接《java设计模式(一)工厂模式》 工厂模式有一缺点,就是破坏了类的封闭性原则。例如,如果需要增加word文件的数据采集,此时按以下步骤操作:...

一、场景描述

《java设计模式(一)工厂模式》

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

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

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

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

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

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

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

如下图所示:

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

二、示例代码

仪器数据采集接口:

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);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。