Java设计模式之Builder建造者模式

作者:马洪彪 时间:2021-12-16 07:21:53 

一、场景描述

建造者模式同工厂模式、抽象工厂模式一样,用于创建继承类对象。

工厂模式:Java设计模式之工厂模式

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

所不同的是,工厂模式下,各子类实现接口,通过工厂类创建子类对象;而建造者模式下,各子类拥有其建造者类,通过它创建不同的父类对象,最终实现多态,实际上子类、父类在代码中是不存在的。

以仪器数据采集工具为例,工厂模式下,定义接口“仪器数据采集工具”,定义子类“PDF文件数据采集工具”和“Excel文件数据采集工具”,子类实现接口。通过工厂类(无论是静态工厂类还是抽象工厂类),创建子类对象,这些对象拥有不同的表现方式,即为多态。

在建造者模式下,定义父类“仪器数据采集工具”,然后通过“PDF文件数据采集工具的建造者类”和“Excel文件数据采集工具的建造者类”来为“仪器数据采集工具”的类对象赋予不同的表现方式(为字段赋予不同的值等),最终实现多态。

建造者模式下,Director好比导演一般,它来调用建造者Builder完成对类对象的创建,调用者调用Director即可,如下图所示:

Java设计模式之Builder建造者模式

当然,工厂模式字面意义是用于创建对象,而建造者模式字面意义是建造不同的对象,两者能实现类似的功能,但两者的应用场景大可不同。

工厂模式应用于某简单类对象的创建,而建造者模式应用于复杂类对象的建造,具体可百度学习体会。

扩展时,例如新增Word文件数据采集,创建其Builder类即可,该类实现Word文件数据采集程序的创建工作;调用时使用WordBuilder类即可调用。

二、示例代码

(父)类:


package lims.designpatterndemo.builderdemo;

public class EquipmentDataCapture {
 private String filePath;
 private String equipmentData;
 //
 public String getFilePath(){
   return this.filePath;
 }
 public void setFilePath(String filePath){
   this.filePath = filePath;
 }
 public String getEquipmentData(){
   return this.equipmentData;
 }
 public void setEquipmentData(String equipmentData){
   this.equipmentData = equipmentData;
 }
}

建造者接口:


package lims.designpatterndemo.builderdemo;

public interface EquipmentDataCaptureBuilder {
 //部件
 void buildFilePath();
 void buildEquipmentData();
 //组装
 EquipmentDataCapture buildEquipmentDataCapture();
}

PDF数据采集建造者类:


package lims.designpatterndemo.builderdemo;

public class PdfFileCaptureBuilder implements EquipmentDataCaptureBuilder{
 //
 EquipmentDataCapture capture;
 //构造
 public PdfFileCaptureBuilder(){
   capture = new EquipmentDataCapture();
 }
 //
 @Override
 public void buildFilePath() {
   capture.setFilePath(".pdf");
 }

@Override
 public void buildEquipmentData() {
   capture.setEquipmentData("pdf file content");
 }

@Override
 public EquipmentDataCapture buildEquipmentDataCapture() {
   return capture;
 }

}

Excel数据采集建造者:


package lims.designpatterndemo.builderdemo;

public class ExcelFileCaptureBuilder implements EquipmentDataCaptureBuilder{

//
 EquipmentDataCapture capture;
 //构造
 public ExcelFileCaptureBuilder(){
   capture = new EquipmentDataCapture();
 }
 @Override
 public void buildFilePath() {
   capture.setFilePath(".xlsx");
 }

@Override
 public void buildEquipmentData() {
   capture.setEquipmentData("excel file content");
 }

@Override
 public EquipmentDataCapture buildEquipmentDataCapture() {
   return capture;
 }

}

Director类,可以简单理解为导演类:


package lims.designpatterndemo.builderdemo;

public class EquipmentDataCaptureDirector {
 public EquipmentDataCapture constructEqiupmentDataCapture(EquipmentDataCaptureBuilder builder){
   builder.buildFilePath();
   builder.buildEquipmentData();
   EquipmentDataCapture capture = builder.buildEquipmentDataCapture();
   return capture;
 }
}

调用端示例:


package lims.designpatterndemo.builderdemo;

public class BuilderDemo {

public static void main(String[] args) {
   EquipmentDataCaptureDirector direcotr = new EquipmentDataCaptureDirector();
   EquipmentDataCaptureBuilder builder = new PdfFileCaptureBuilder();
   builder = new ExcelFileCaptureBuilder();
   EquipmentDataCapture capture = direcotr.constructEqiupmentDataCapture(builder);
   System.out.println(capture.getEquipmentData());
 }

}

来源:http://www.cnblogs.com/mahongbiao/p/8621591.html

标签:Java,Builder,建造者模式
0
投稿

猜你喜欢

  • Idea里github的图形化操作配置方法

    2021-12-29 15:03:17
  • Java中Function的使用及说明

    2023-08-12 03:04:29
  • 浅谈virtual、abstract方法和静态方法、静态变量理解

    2022-08-29 02:29:14
  • 源码解析JDK 1.8 中的 Map.merge()

    2023-11-16 23:49:25
  • maven setting.xml文件配置禅定之旅

    2023-01-08 12:07:19
  • java继承中的构造方法实例解析

    2022-07-26 02:56:00
  • SpringBoot注入自定义的配置文件的方法详解

    2021-12-24 02:28:06
  • Spring boot配置绑定和配置属性校验的方式详解

    2022-04-21 03:06:06
  • 利用logback 设置不同包下的日志级别

    2022-08-11 20:05:43
  • Lombok中@EqualsAndHashCode注解的使用及说明

    2023-11-30 04:47:05
  • 怎么把本地jar包放入本地maven仓库和远程私服仓库

    2023-12-05 20:13:00
  • Java 数据结构与算法系列精讲之排序算法

    2023-11-01 13:25:40
  • Android自定义带圆点的半圆形进度条

    2023-08-05 07:47:15
  • Spring事务失效问题分析及解决方案

    2023-07-09 11:08:15
  • Java Mybatis框架Dao层的实现与映射文件以及核心配置文件详解分析

    2021-06-15 16:29:22
  • Java实现图片倒影的源码实例内容

    2022-08-30 02:39:24
  • Java如何使用Optional与Stream取代if判空逻辑(JDK8以上)

    2022-01-15 02:52:53
  • java代码实现C盘文件统计工具

    2021-06-23 01:22:38
  • java利用Future实现多线程执行与结果聚合实例代码

    2023-09-24 11:07:18
  • Android缓存机制——LruCache的详解

    2023-07-30 07:26:34
  • asp之家 软件编程 m.aspxhome.com