生成器模式(Build)

来源:互联网 发布:2016网络彩票开售在即 编辑:程序博客网 时间:2024/06/05 14:20
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
本质:分离整体构建算法和部件构造。

不用模式的解决方案:
package cn.javass.dp.builder.example1;/** * 描述输出到文件头的内容的对象 */public class ExportHeaderModel {    /**     * 分公司或门市点编号     */    private String depId;    /**     * 导出数据的日期     */    private String exportDate;    public String getDepId() {        return depId;    }    public void setDepId(String depId) {        this.depId = depId;    }    public String getExportDate() {        return exportDate;    }    public void setExportDate(String exportDate) {        this.exportDate = exportDate;    }}

package cn.javass.dp.builder.example1;/** * 描述输出数据的对象 */public class ExportDataModel {    /**     * 产品编号     */    private String productId;    /**     * 销售价格     */    private double price;    /**     * 销售数量     */    private double amount;    public String getProductId() {        return productId;    }    public void setProductId(String productId) {        this.productId = productId;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public double getAmount() {        return amount;    }    public void setAmount(double amount) {        this.amount = amount;    }}

package cn.javass.dp.builder.example1;/** * 描述输出到文件尾的内容的对象 */public class ExportFooterModel {    /**     * 输出人     */    private String exportUser;    public String getExportUser() {        return exportUser;    }    public void setExportUser(String exportUser) {        this.exportUser = exportUser;    }}

package cn.javass.dp.builder.example1;import java.util.*;/** * 导出数据到文本文件的对象 */public class ExportToTxt {    /**     * 导出数据到文本文件     *     * @param ehm     文件头的内容     * @param mapData 数据的内容     * @param efm     文件尾的内容     */    public void export(ExportHeaderModel ehm, Map<String, Collection<ExportDataModel>> mapData, ExportFooterModel efm) {        //用来记录最终输出的文件内容        StringBuffer buffer = new StringBuffer();        //1:先来拼接文件头的内容        buffer.append(ehm.getDepId() + "," + ehm.getExportDate() + "\n");        //2:接着来拼接文件体的内容        for (String tblName : mapData.keySet()) {            //先拼接表名称            buffer.append(tblName + "\n");            //然后循环拼接具体数据            for (ExportDataModel edm : mapData.get(tblName)) {                buffer.append(edm.getProductId() + "," + edm.getPrice() + "," + edm.getAmount() + "\n");            }        }        //3:接着来拼接文件尾的内容        buffer.append(efm.getExportUser());        //为了演示简洁性,这里就不去写输出文件的代码了        //把要输出的内容输出到控制台看看        System.out.println("输出到文本文件的内容:\n" + buffer);    }}

package cn.javass.dp.builder.example1;import java.util.Collection;import java.util.Map;/** * 导出数据到XML文件的对象 */public class ExportToXml {    /**     * 导出数据到XML文件     *     * @param ehm     文件头的内容     * @param mapData 数据的内容     * @param efm     文件尾的内容     */    public void export(ExportHeaderModel ehm, Map<String, Collection<ExportDataModel>> mapData, ExportFooterModel efm) {        //用来记录最终输出的文件内容        StringBuffer buffer = new StringBuffer();        //1:先来拼接文件头的内容        buffer.append("<?xml version='1.0' encoding='gb2312'?>\n");        buffer.append("<Report>\n");        buffer.append("  <Header>\n");        buffer.append("    <DepId>" + ehm.getDepId() + "</DepId>\n");        buffer.append("    <ExportDate>" + ehm.getExportDate() + "</ExportDate>\n");        buffer.append("  </Header>\n");        //2:接着来拼接文件体的内容        buffer.append("  <Body>\n");        for (String tblName : mapData.keySet()) {            //先拼接表名称            buffer.append("    <Datas TableName=\"" + tblName + "\">\n");            //然后循环拼接具体数据            for (ExportDataModel edm : mapData.get(tblName)) {                buffer.append("      <Data>\n");                buffer.append("        <ProductId>" + edm.getProductId() + "</ProductId>\n");                buffer.append("        <Price>" + edm.getPrice() + "</Price>\n");                buffer.append("        <Amount>" + edm.getAmount() + "</Amount>\n");                buffer.append("      </Data>\n");            }            buffer.append("    </Datas>\n");        }        buffer.append("  </Body>\n");        //3:接着来拼接文件尾的内容        buffer.append("  <Footer>\n");        buffer.append("    <ExportUser>" + efm.getExportUser() + "</ExportUser>\n");        buffer.append("  </Footer>\n");        buffer.append("</Report>\n");        //为了演示简洁性,这里就不去写输出文件的代码了        //把要输出的内容输出到控制台看看        System.out.println("输出到XML文件的内容:\n" + buffer);    }}

package cn.javass.dp.builder.example1;import java.util.*;public class Client {    public static void main(String[] args) {        //准备测试数据        ExportHeaderModel ehm = new ExportHeaderModel();        ehm.setDepId("一分公司");        ehm.setExportDate("2010-05-18");        Map<String, Collection<ExportDataModel>> mapData = new HashMap<String, Collection<ExportDataModel>>();        Collection<ExportDataModel> col = new ArrayList<ExportDataModel>();        ExportDataModel edm1 = new ExportDataModel();        edm1.setProductId("产品001号");        edm1.setPrice(100);        edm1.setAmount(80);        ExportDataModel edm2 = new ExportDataModel();        edm2.setProductId("产品002号");        edm2.setPrice(99);        edm2.setAmount(55);        //把数据组装起来        col.add(edm1);        col.add(edm2);        mapData.put("销售记录表", col);        ExportFooterModel efm = new ExportFooterModel();        efm.setExportUser("张三");        //测试输出到文本文件        ExportToTxt toTxt = new ExportToTxt();        toTxt.export(ehm, mapData, efm);        //测试输出到xml文件        ExportToXml toXml = new ExportToXml();        toXml.export(ehm, mapData, efm);    }}

使用生成器模式来解决问题


package cn.javass.dp.builder.example2;/** * 构建器接口,定义创建一个产品对象所需的各个部件的操作 */public interface Builder {    /**     * 示意方法,构建某个部件     */    public void buildPart();}

package cn.javass.dp.builder.example2;/** * 具体的构建器实现对象 */public class ConcreteBuilder implements Builder {    /**     * 构建器最终构建的产品对象     */    private Product resultProduct;    /**     * 获取构建器最终构建的产品对象     *     * @return 构建器最终构建的产品对象     */    public Product getResult() {        return resultProduct;    }    public void buildPart() {        //构建某个部件的功能处理    }}

package cn.javass.dp.builder.example2;/** * 指导者,指导使用构建器的接口来构建产品的对象 */public class Director {    /**     * 持有当前需要使用的构建器对象     */    private Builder builder;    /**     * 构造方法,传入构建器对象     *     * @param builder 构建器对象     */    public Director(Builder builder) {        this.builder = builder;    }    /**     * 示意方法,指导构建器构建最终的产品对象     */    public void construct() {        //通过使用构建器接口来构建最终的产品对象        builder.buildPart();    }}

package cn.javass.dp.builder.example2;/** * 被构建的产品对象的接口 */public interface Product {    //定义产品的操作}



package cn.javass.dp.builder.example3;import java.util.Collection;import java.util.Map;/** * 构建器接口,定义创建一个输出文件对象所需的各个部件的操作 */public interface Builder {    /**     * 构建输出文件的Header部分     *     * @param ehm 文件头的内容     */    public void buildHeader(ExportHeaderModel ehm);    /**     * 构建输出文件的Body部分     *     * @param mapData 要输出的数据的内容     */    public void buildBody(Map<String, Collection<ExportDataModel>> mapData);    /**     * 构建输出文件的Footer部分     *     * @param efm 文件尾的内容     */    public void buildFooter(ExportFooterModel efm);}

package cn.javass.dp.builder.example3;import java.util.Collection;import java.util.Map;/** * 实现导出数据到文本文件的的构建器对象 */public class TxtBuilder implements Builder {    /**     * 用来记录构建的文件的内容,相当于产品     */    private StringBuffer buffer = new StringBuffer();    public void buildBody(            Map<String, Collection<ExportDataModel>> mapData) {        for (String tblName : mapData.keySet()) {            //先拼接表名称            buffer.append(tblName + "\n");            //然后循环拼接具体数据            for (ExportDataModel edm : mapData.get(tblName)) {                buffer.append(edm.getProductId() + "," + edm.getPrice() + "," + edm.getAmount() + "\n");            }        }    }    public void buildFooter(ExportFooterModel efm) {        buffer.append(efm.getExportUser());    }    public void buildHeader(ExportHeaderModel ehm) {        buffer.append(ehm.getDepId() + "," + ehm.getExportDate() + "\n");    }    public StringBuffer getResult() {        return buffer;    }}

package cn.javass.dp.builder.example3;import java.util.Collection;import java.util.Map;/** * 实现导出数据到XML文件的的构建器对象 */public class XmlBuilder implements Builder {    /**     * 用来记录构建的文件的内容,相当于产品     */    private StringBuffer buffer = new StringBuffer();    public void buildBody(            Map<String, Collection<ExportDataModel>> mapData) {        buffer.append("  <Body>\n");        for (String tblName : mapData.keySet()) {            //先拼接表名称            buffer.append("    <Datas TableName=\"" + tblName + "\">\n");            //然后循环拼接具体数据            for (ExportDataModel edm : mapData.get(tblName)) {                buffer.append("      <Data>\n");                buffer.append("        <ProductId>" + edm.getProductId() + "</ProductId>\n");                buffer.append("        <Price>" + edm.getPrice() + "</Price>\n");                buffer.append("        <Amount>" + edm.getAmount() + "</Amount>\n");                buffer.append("      </Data>\n");            }            buffer.append("    </Datas>\n");        }        buffer.append("  </Body>\n");    }    public void buildFooter(ExportFooterModel efm) {        buffer.append("  <Footer>\n");        buffer.append("    <ExportUser>" + efm.getExportUser() + "</ExportUser>\n");        buffer.append("  </Footer>\n");        buffer.append("</Report>\n");    }    public void buildHeader(ExportHeaderModel ehm) {        buffer.append("<?xml version='1.0' encoding='gb2312'?>\n");        buffer.append("<Report>\n");        buffer.append("  <Header>\n");        buffer.append("    <DepId>" + ehm.getDepId() + "</DepId>\n");        buffer.append("    <ExportDate>" + ehm.getExportDate() + "</ExportDate>\n");        buffer.append("  </Header>\n");    }    public StringBuffer getResult() {        return buffer;    }}

package cn.javass.dp.builder.example3;import java.util.Collection;import java.util.Map;/** * 指导者,指导使用构建器的接口来构建输出的文件的对象 */public class Director {    /**     * 持有当前需要使用的构建器对象     */    private Builder builder;    /**     * 构造方法,传入构建器对象     *     * @param builder 构建器对象     */    public Director(Builder builder) {        this.builder = builder;    }    /**     * 指导构建器构建最终的输出的文件的对象     *     * @param ehm     文件头的内容     * @param mapData 数据的内容     * @param efm     文件尾的内容     */    public void construct(ExportHeaderModel ehm, Map<String, Collection<ExportDataModel>> mapData, ExportFooterModel efm) {        //1:先构建Header        builder.buildHeader(ehm);        //2:然后构建Body        builder.buildBody(mapData);        //3:然后构建Footer        builder.buildFooter(efm);    }}

package cn.javass.dp.builder.example3;import java.util.*;public class Client {    public static void main(String[] args) {        //准备测试数据        ExportHeaderModel ehm = new ExportHeaderModel();        ehm.setDepId("一分公司");        ehm.setExportDate("2010-05-18");        Map<String, Collection<ExportDataModel>> mapData = new HashMap<String, Collection<ExportDataModel>>();        Collection<ExportDataModel> col = new ArrayList<ExportDataModel>();        ExportDataModel edm1 = new ExportDataModel();        edm1.setProductId("产品001号");        edm1.setPrice(100);        edm1.setAmount(80);        ExportDataModel edm2 = new ExportDataModel();        edm2.setProductId("产品002号");        edm2.setPrice(99);        edm2.setAmount(55);        //把数据组装起来        col.add(edm1);        col.add(edm2);        mapData.put("销售记录表", col);        ExportFooterModel efm = new ExportFooterModel();        efm.setExportUser("张三");        //测试输出到文本文件        TxtBuilder txtBuilder = new TxtBuilder();        //创建指导者对象        Director director = new Director(txtBuilder);        director.construct(ehm, mapData, efm);        //把要输出的内容输出到控制台看看        System.out.println("输出到文本文件的内容:\n" + txtBuilder.getResult());        //测试输出到xml文件        XmlBuilder xmlBuilder = new XmlBuilder();        Director director2 = new Director(xmlBuilder);        director2.construct(ehm, mapData, efm);        //把要输出的内容输出到控制台看看        System.out.println("输出到XML文件的内容:\n" + xmlBuilder.getResult());    }}

package cn.javass.dp.builder.example3;/** * 描述输出数据的对象 */public class ExportDataModel {    /**     * 产品编号     */    private String productId;    /**     * 销售价格     */    private double price;    /**     * 销售数量     */    private double amount;    public String getProductId() {        return productId;    }    public void setProductId(String productId) {        this.productId = productId;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public double getAmount() {        return amount;    }    public void setAmount(double amount) {        this.amount = amount;    }}

package cn.javass.dp.builder.example3;/** * 描述输出到文件尾的内容的对象 */public class ExportFooterModel {    /**     * 输出人     */    private String exportUser;    public String getExportUser() {        return exportUser;    }    public void setExportUser(String exportUser) {        this.exportUser = exportUser;    }}

package cn.javass.dp.builder.example3;/** * 描述输出到文件头的内容的对象 */public class ExportHeaderModel {    /**     * 分公司或门市点编号     */    private String depId;    /**     * 导出数据的日期     */    private String exportDate;    public String getDepId() {        return depId;    }    public void setDepId(String depId) {        this.depId = depId;    }    public String getExportDate() {        return exportDate;    }    public void setExportDate(String exportDate) {        this.exportDate = exportDate;    }}


0 0
原创粉丝点击