生成器模式(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
- 生成器模式(Build)
- 生成器模式(Build)
- 设计模式学习笔记(二)——Build生成器
- Builder(生成器模式)
- Builder(生成器)模式
- Builder(生成器模式)
- 生成器模式(Builder)
- 生成器模式(Builder)
- 生成器模式(Builder Pattern )
- 生成器(Builder)设计模式
- 设计模式---生成器(Builder)
- 生成器模式
- 生成器模式
- 生成器模式
- 生成器模式
- 生成器模式
- 生成器模式
- 生成器模式
- Android中Acition和Category常量表
- Android网络连接类型
- OpenGL ES之GLSurfaceView学习一:介绍
- 对curl的封装
- Intel IPP 之图像处理
- 生成器模式(Build)
- zf2+mysql Statement could not be executed (HY000 - 1030 - Got error 28 from storage engine)
- 2015 UESTC Winter Training 中的简单搜索
- 如何使用Dreamweaver设计限时自动关闭的网页
- Impala入门笔记(转载)
- IOS去警告
- Android编译系统makefile(Android.mk)写法
- Android自定义类似ProgressDialog效果的Dialog
- 高效 Java Web 开发框架 JessMA v3.5.1 正式发布