定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
本质:分离整体构建算法和部件构造。
不用模式的解决方案:
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;
}
}