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


    一、场景描述

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

    工厂模式: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类即可调用。

    二、示例代码

     (父)类:

    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());
        }
    
    }
  • 相关阅读:
    PHP 7安装使用体验,升级PHP要谨慎
    PHP里10个鲜为人知但却非常有用的函数
    解决 PHPExcel 长数字串显示为科学计数
    linux安装jdk1.6
    虚拟机下Redhat9 网络配置问题(转)
    windows下的一些命令
    redis高级应用特征
    乐观锁的概念
    windows配置redis(转)
    redis常用命令
  • 原文地址:https://www.cnblogs.com/mahongbiao/p/8621591.html
Copyright © 2020-2023  润新知