设计模式学习笔记------生成器模式

                  生成器模式

一、代码示例

  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 }

 

posted @ 2018-01-15 16:00  有悟还有迷  阅读(153)  评论(0编辑  收藏  举报