设计模式学习笔记------生成器模式
生成器模式
一、代码示例
1.需求:导出文件不管什么格式,都分为3个部分,分贝是头文件、文件体、和文件尾。
1 /** 2 * 描述输出到文件头的内容的对象 3 * @author abc 4 * 5 */ 6 public class ExportHeaderModel { 7 /** 8 * 分公司或门市店编号 9 */ 10 private String deptId; 11 12 /** 13 * 导出数据的日期 14 */ 15 private String exportDate; 16 17 public String getDeptId() { 18 return deptId; 19 } 20 public void setDeptId(String deptId) { 21 this.deptId = deptId; 22 } 23 public String getExportDate() { 24 return exportDate; 25 } 26 public void setExportDate(String exportDate) { 27 this.exportDate = exportDate; 28 } 29 30 } 31 32 33 /** 34 * 描述输出数据的对象 35 * @author abc 36 * 37 */ 38 public class ExportDataModel { 39 40 /** 41 * 产品编号 42 */ 43 private String productId; 44 45 /** 46 * 销售价格 47 */ 48 private double price; 49 50 /** 51 * 销售数量 52 */ 53 private double amount; 54 55 public String getProductId() { 56 return productId; 57 } 58 59 public void setProductId(String productId) { 60 this.productId = productId; 61 } 62 63 public double getPrice() { 64 return price; 65 } 66 67 public void setPrice(double price) { 68 this.price = price; 69 } 70 71 public double getAmount() { 72 return amount; 73 } 74 75 public void setAmount(double amount) { 76 this.amount = amount; 77 } 78 79 } 80 81 82 /** 83 * 描述输出到文件尾的内容的对象 84 */ 85 public class ExportFooterModel { 86 /** 87 * 输出人 88 */ 89 private String exportUser; 90 91 public String getExportUser() { 92 return exportUser; 93 } 94 95 public void setExportUser(String exportUser) { 96 this.exportUser = exportUser; 97 } 98 99 } 100 101 102 /** 103 * 导出数据到文本文件的对象 104 * @author abc 105 * 106 */ 107 public class ExportToTxt { 108 109 public void export(ExportHeaderModel ehm, 110 Map<String, Collection<ExportDataModel>> mapData, 111 ExportFooterModel efm) { 112 //用来记录最终输出的文件内容 113 StringBuffer buffer = new StringBuffer(); 114 //1:先来拼接文件头的内容 115 buffer.append(ehm.getDeptId() + "," + ehm.getExportDate() + "\n"); 116 117 //2:接着来拼接文件体内容 118 for (String tblName : mapData.keySet()) { 119 //先拼接表名称 120 buffer.append(tblName + "\n"); 121 //然后循环拼接具体数据 122 for (ExportDataModel edm : mapData.get(tblName)) { 123 buffer.append(edm.getProductId() + "," + edm.getPrice() + "," + edm.getAmount() + "\n"); 124 } 125 } 126 127 //3.接着来拼接文件尾的内容 128 buffer.append(efm.getExportUser()); 129 130 //为了演示的简洁性,这里就不再写输出文件的代码了 131 //把要输出的内容输出到控制台看看 132 System.out.println("输出到文本文件的内容: \n" + buffer); 133 } 134 } 135 136 137 /** 138 * 导出数据到XML文件的对象 139 * @author abc 140 * 141 */ 142 public class ExportToXml { 143 144 public void export(ExportHeaderModel ehm, 145 Map<String, Collection<ExportDataModel>> mapData, 146 ExportFooterModel efm) { 147 //用来记录最终输出的文件内容 148 StringBuffer buffer = new StringBuffer(); 149 //1:先来拼接文件头的内容 150 buffer.append("<?xml version='1.0' encoding='gb2312'?>\n"); 151 buffer.append("<Report>\n"); 152 buffer.append(" <Header>\n"); 153 buffer.append(" <DepId>" + ehm.getDeptId() + "</DepId>\n"); 154 buffer.append(" <ExportDate>" + ehm.getExportDate() + "</ExportDate>\n"); 155 buffer.append(" </Header>\n"); 156 //2.再来拼接文件体的内容 157 buffer.append(" <Body>\n"); 158 for (String tblName : mapData.keySet()) { 159 //先拼接表名称 160 buffer.append(" <Datas TableName=\"" + tblName + "\">\n"); 161 //然后循环拼接具体数据 162 for (ExportDataModel edm : mapData.get(tblName)) { 163 buffer.append(" <Data>\n"); 164 buffer.append(" <ProductId>" + edm.getProductId() + "</ProductId>\n"); 165 buffer.append(" <Price>" + edm.getPrice() + "</Price>\n"); 166 buffer.append(" <Amount>" + edm.getAmount() + "</Amount>\n"); 167 buffer.append(" </Data>\n"); 168 } 169 buffer.append(" </Datas>\n"); 170 } 171 buffer.append(" </Body>\n"); 172 //3:接着来拼接文件尾的内容 173 buffer.append(" <Footer>\n"); 174 buffer.append(" <ExprotUser>" + efm.getExportUser() + "</ExportUser>\n"); 175 buffer.append(" </Footer>\n"); 176 buffer.append("</Report>\n"); 177 178 System.out.println("输出到XML文件的内容: \n" + buffer); 179 } 180 } 181 182 183 public class Client { 184 public static void main(String[] args) { 185 //准备数据 186 ExportHeaderModel ehm = new ExportHeaderModel(); 187 ehm.setDeptId("一分公司"); 188 ehm.setExportDate("2018-02-15"); 189 190 Map<String, Collection<ExportDataModel>> mapData = new HashMap<String, Collection<ExportDataModel>>(); 191 Collection<ExportDataModel> col = new ArrayList<ExportDataModel>(); 192 193 ExportDataModel edm1 = new ExportDataModel(); 194 edm1.setProductId("产品001号"); 195 edm1.setPrice(100); 196 edm1.setAmount(80); 197 198 ExportDataModel edm2 = new ExportDataModel(); 199 edm2.setProductId("产品002号"); 200 edm2.setPrice(99); 201 edm2.setAmount(55); 202 //包数据组装起来 203 col.add(edm1); 204 col.add(edm2); 205 mapData.put("销售记录表", col); 206 207 ExportFooterModel efm = new ExportFooterModel(); 208 efm.setExportUser("张三"); 209 //测试输出到文本文件 210 ExportToTxt toTxt = new ExportToTxt(); 211 toTxt.export(ehm, mapData, efm); 212 //测试输出到XML 213 ExportToXml toXml = new ExportToXml(); 214 toXml.export(ehm, mapData, efm); 215 } 216 }
2.使用生成器模式
1 /** 2 * 生成器接口,定义创建一个输出文件对象所需的各个部件的操作 3 * @author abc 4 * 5 */ 6 public interface Builder { 7 8 /** 9 * 构建输出文件的Header部分 10 * @param ehm 头文件的内容 11 */ 12 public void buildHeader(ExportHeaderModel ehm); 13 14 /** 15 * 构建输出文件的Body部分 16 * @param mapData 要输出的数据的内容 17 */ 18 public void buildBody(Map<String, Collection<ExportDataModel>> mapData); 19 20 /** 21 * 构建输出文件的Footer部分 22 * @param efm 文件尾部的内容 23 */ 24 public void buildFooter(ExportFooterModel efm); 25 } 26 27 28 /** 29 * 具体生成器的实现对象 30 * @author abc 31 * 32 */ 33 public class Director { 34 35 /** 36 * 持有当前需要使用的生成器对象 37 */ 38 private Builder builder; 39 40 /** 41 * 构造方法,传入生成器对象 42 * @param builder 生成器对象 43 */ 44 public Director(Builder builder) { 45 this.builder = builder; 46 } 47 48 public void construct(ExportHeaderModel ehm, 49 Map<String, Collection<ExportDataModel>> mapData, 50 ExportFooterModel efm) { 51 //1:先构建Header 52 builder.buildHeader(ehm); 53 54 //2:然后构建Body 55 builder.buildBody(mapData); 56 57 //3:在构建Footer 58 builder.buildFooter(efm); 59 } 60 } 61 62 63 /** 64 * 实现导出数据到文本文件的生产器对象 65 * @author abc 66 * 67 */ 68 public class TxtBuilder implements Builder { 69 70 /** 71 * 用来记录构建文件的内容,相当于产品 72 */ 73 private StringBuffer buffer = new StringBuffer(); 74 75 @Override 76 public void buildHeader(ExportHeaderModel ehm) { 77 buffer.append(ehm.getDeptId() + "," + ehm.getExportDate() + "\n"); 78 } 79 80 @Override 81 public void buildBody(Map<String, Collection<ExportDataModel>> mapData) { 82 for (String tblName : mapData.keySet()) { 83 //先拼接表名称 84 buffer.append(tblName + "\n"); 85 //然后循环拼接具体数据 86 for (ExportDataModel edm : mapData.get(tblName)) { 87 buffer.append(edm.getProductId() + "," + edm.getPrice() + "," + edm.getAmount() + "\n"); 88 } 89 } 90 } 91 92 @Override 93 public void buildFooter(ExportFooterModel efm) { 94 buffer.append(efm.getExportUser()); 95 } 96 97 public StringBuffer getResult() { 98 return buffer; 99 } 100 } 101 102 103 /** 104 * 实现导出数据到XML文件的生产器对象 105 * @author abc 106 * 107 */ 108 public class XmlBuilder implements Builder { 109 110 /** 111 * 用来记录构建文件的内容,相当于产品 112 */ 113 private StringBuffer buffer = new StringBuffer(); 114 115 @Override 116 public void buildHeader(ExportHeaderModel ehm) { 117 buffer.append("<?xml version='1.0' encoding='gb2312'?>\n"); 118 buffer.append("<Report>\n"); 119 buffer.append(" <Header>\n"); 120 buffer.append(" <DepId>" + ehm.getDeptId() + "</DepId>\n"); 121 buffer.append(" <ExportDate>" + ehm.getExportDate() + "</ExportDate>\n"); 122 buffer.append(" </Header>\n"); 123 } 124 125 @Override 126 public void buildBody(Map<String, Collection<ExportDataModel>> mapData) { 127 buffer.append(" <Body>\n"); 128 for (String tblName : mapData.keySet()) { 129 //先拼接表名称 130 buffer.append(" <Datas TableName=\"" + tblName + "\">\n"); 131 //然后循环拼接具体数据 132 for (ExportDataModel edm : mapData.get(tblName)) { 133 buffer.append(" <Data>\n"); 134 buffer.append(" <ProductId>" + edm.getProductId() + "</ProductId>\n"); 135 buffer.append(" <Price>" + edm.getPrice() + "</Price>\n"); 136 buffer.append(" <Amount>" + edm.getAmount() + "</Amount>\n"); 137 buffer.append(" </Data>\n"); 138 } 139 buffer.append(" </Datas>\n"); 140 } 141 buffer.append(" </Body>\n"); 142 } 143 144 @Override 145 public void buildFooter(ExportFooterModel efm) { 146 buffer.append(" <Footer>\n"); 147 buffer.append(" <ExprotUser>" + efm.getExportUser() + "</ExportUser>\n"); 148 buffer.append(" </Footer>\n"); 149 buffer.append("</Report>\n"); 150 } 151 152 public StringBuffer getResult() { 153 return buffer; 154 } 155 } 156 157 158 public class Client { 159 public static void main(String[] args) { 160 //准备数据 161 ExportHeaderModel ehm = new ExportHeaderModel(); 162 ehm.setDeptId("一分公司"); 163 ehm.setExportDate("2018-02-15"); 164 165 Map<String, Collection<ExportDataModel>> mapData = new HashMap<String, Collection<ExportDataModel>>(); 166 Collection<ExportDataModel> col = new ArrayList<ExportDataModel>(); 167 168 ExportDataModel edm1 = new ExportDataModel(); 169 edm1.setProductId("产品001号"); 170 edm1.setPrice(100); 171 edm1.setAmount(80); 172 173 ExportDataModel edm2 = new ExportDataModel(); 174 edm2.setProductId("产品002号"); 175 edm2.setPrice(99); 176 edm2.setAmount(55); 177 //包数据组装起来 178 col.add(edm1); 179 col.add(edm2); 180 mapData.put("销售记录表", col); 181 182 ExportFooterModel efm = new ExportFooterModel(); 183 efm.setExportUser("张三"); 184 185 //测试输出到文本文件 186 TxtBuilder txtBuilder = new TxtBuilder(); 187 //创建指导者对象 188 Director director = new Director(txtBuilder); 189 director.construct(ehm, mapData, efm); 190 System.out.println("输出到文本文件的内容:\n" + txtBuilder.getResult()); 191 192 //测试输出到XML 193 XmlBuilder xmlBuilder = new XmlBuilder(); 194 Director direcotr2 = new Director(xmlBuilder); 195 direcotr2.construct(ehm, mapData, efm); 196 System.out.println("输出到XML文件的内容:\n" + xmlBuilder.getResult()); 197 } 198 }