前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java设计模式(四)Builder建造者模式

Java设计模式(四)Builder建造者模式

作者头像
用户1637609
发布2018-04-12 15:41:54
1.1K0
发布2018-04-12 15:41:54
举报
文章被收录于专栏:马洪彪马洪彪

一、场景描述

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

工厂模式:http://www.cnblogs.com/mahongbiao/p/8618970.html

抽象工厂模式:http://www.cnblogs.com/mahongbiao/p/8619054.html

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

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

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

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

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

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

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

二、示例代码

 (父)类:

代码语言:javascript
复制
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;
    }
}

建造者接口:

代码语言:javascript
复制
package lims.designpatterndemo.builderdemo;

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

PDF数据采集建造者类:

代码语言:javascript
复制
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数据采集建造者:

代码语言:javascript
复制
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类,可以简单理解为导演类:

代码语言:javascript
复制
package lims.designpatterndemo.builderdemo;

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

调用端示例:

代码语言:javascript
复制
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());
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、场景描述
  • 二、示例代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档