设计模式之建造者模式
建造者模式
建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
理解建造者模式:
建造者模式分成两个很重要的部分一部分是Bulder接口这边,这边定义了如何构建这个部件,也就知道每个部件功能如何实现,以及如何装配这些功能到产品中。另外一部分是在Director,他知道如何组合构建产品,也就是说Director负责整体的构建算法,而且通常是分步骤执行的。
public class ExportDataModel { /** * 合同编号 */ private String contractID; /** * 客户名称 */ private String userName; /** * 电话 */ private String telephone; public String getContractID() { return contractID; } public void setContractID(String contractID) { this.contractID = contractID; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } }
public class ExportHeaderModel { /** * 公司名称 */ private String companyName; /** * 操作时间 */ private String opeTime; public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } public String getOpeTime() { return opeTime; } public void setOpeTime(String opeTime) { this.opeTime = opeTime; } }
public class ExportFooterModel { /** * 操作人 */ private String opeUser; public String getOpeUser() { return opeUser; } public void setOpeUser(String opeUser) { this.opeUser = opeUser; } }
public interface Builder { /**文件头 * @param header */ void buildHeader(ExportHeaderModel header); /**文件内容 * @param data */ void bulidBody(Map<String,List<ExportDataModel>> data); /**文件尾 * @param footer */ void bulidFooter(ExportFooterModel footer); }
public class TxtBuilder implements Builder { private StringBuffer str = new StringBuffer(); @Override public void buildHeader(ExportHeaderModel header) { str.append(header.getCompanyName()+","+header.getOpeTime()+"\n"); } @Override public void bulidBody(Map<String, List<ExportDataModel>> data) { for(String tbname:data.keySet()){ str.append(tbname + "\n"); for(ExportDataModel data1 : data.get(tbname)){ str.append(data1.getContractID()+","+data1.getUserName()+","+data1.getTelephone()+"\n"); } } } @Override public void bulidFooter(ExportFooterModel footer) { str.append(footer.getOpeUser()); } public StringBuffer getResult(){ return str; } }
/** * 指导者,指导使用构建器的接口来构建输出的文件对象 * */ public class Director { private Builder builder; public Director(Builder builder){ this.builder = builder; } /** * 指导构建器 最终输出文件对象 * @param hm * @param data * @param fm */ public void contruct(ExportHeaderModel hm,Map<String,List<ExportDataModel>> data,ExportFooterModel fm){ builder.buildHeader(hm); builder.bulidBody(data); builder.bulidFooter(fm); } }
public class Test { public static void main(String[] args) { //准备测试数据 ExportHeaderModel header = new ExportHeaderModel(); header.setCompanyName("XX公司"); header.setOpeTime(new SimpleDateFormat("yyyy-mm-dd").format(new Date())); Map<String,List<ExportDataModel>> body = new HashMap<String,List<ExportDataModel>>(); List<ExportDataModel> list = new ArrayList<ExportDataModel>(); ExportDataModel data1 = new ExportDataModel(); data1.setContractID(String.valueOf(System.currentTimeMillis())); data1.setTelephone("134567890"); data1.setUserName("风清扬"); list.add(data1); ExportDataModel data2 = new ExportDataModel(); data2.setContractID(String.valueOf(System.currentTimeMillis())); data2.setTelephone("134567880"); data2.setUserName("令狐"); list.add(data2); body.put("授信合同明细", list); ExportFooterModel footer = new ExportFooterModel(); footer.setOpeUser("岳不群"); TxtBuilder txt = new TxtBuilder(); Director dir = new Director(txt); dir.contruct(header,body,footer); System.out.println(txt.getResult()); } }
源码实例:
在什么情况下使用建造者模式
1. 需要生成的产品对象有复杂的内部结构,每一个内部成分本身可以是对象,也可以仅仅是一个对象(即产品对象)的一个组成部分。
2. 需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式是一个很好的设计思想。
3. 在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。