Java设计模式之Builder建造者模式
一、场景描述
建造者模式同工厂模式、抽象工厂模式一样,用于创建继承类对象。
工厂模式:java设计模式之工厂模式
抽象工厂模式:java设计模式之抽象工厂模式
所不同的是,工厂模式下,各子类实现接口,通过工厂类创建子类对象;而建造者模式下,各子类拥有其建造者类,通过它创建不同的父类对象,最终实现多态,实际上子类、父类在代码中是不存在的。
以仪器数据采集工具为例,工厂模式下,定义接口“仪器数据采集工具”,定义子类“pdf文件数据采集工具”和“excel文件数据采集工具”,子类实现接口。通过工厂类(无论是静态工厂类还是抽象工厂类),创建子类对象,这些对象拥有不同的表现方式,即为多态。
在建造者模式下,定义父类“仪器数据采集工具”,然后通过“pdf文件数据采集工具的建造者类”和“excel文件数据采集工具的建造者类”来为“仪器数据采集工具”的类对象赋予不同的表现方式(为字段赋予不同的值等),最终实现多态。
建造者模式下,director好比导演一般,它来调用建造者builder完成对类对象的创建,调用者调用director即可,如下图所示:
当然,工厂模式字面意义是用于创建对象,而建造者模式字面意义是建造不同的对象,两者能实现类似的功能,但两者的应用场景大可不同。
工厂模式应用于某简单类对象的创建,而建造者模式应用于复杂类对象的建造,具体可百度学习体会。
扩展时,例如新增word文件数据采集,创建其builder类即可,该类实现word文件数据采集程序的创建工作;调用时使用wordbuilder类即可调用。
二、示例代码
(父)类:
package lims.designpatterndemo.builderdemo; public class equipmentdatacapture { private string filepath; private string equipmentdata; // public string getfilepath(){ return this.filepath; } public void setfilepath(string filepath){ this.filepath = filepath; } public string getequipmentdata(){ return this.equipmentdata; } public void setequipmentdata(string equipmentdata){ this.equipmentdata = equipmentdata; } }
建造者接口:
package lims.designpatterndemo.builderdemo; public interface equipmentdatacapturebuilder { //部件 void buildfilepath(); void buildequipmentdata(); //组装 equipmentdatacapture buildequipmentdatacapture(); }
pdf数据采集建造者类:
package lims.designpatterndemo.builderdemo; public class pdffilecapturebuilder implements equipmentdatacapturebuilder{ // equipmentdatacapture capture; //构造 public pdffilecapturebuilder(){ capture = new equipmentdatacapture(); } // @override public void buildfilepath() { capture.setfilepath(".pdf"); } @override public void buildequipmentdata() { capture.setequipmentdata("pdf file content"); } @override public equipmentdatacapture buildequipmentdatacapture() { return capture; } }
excel数据采集建造者:
package lims.designpatterndemo.builderdemo; public class excelfilecapturebuilder implements equipmentdatacapturebuilder{ // equipmentdatacapture capture; //构造 public excelfilecapturebuilder(){ capture = new equipmentdatacapture(); } @override public void buildfilepath() { capture.setfilepath(".xlsx"); } @override public void buildequipmentdata() { capture.setequipmentdata("excel file content"); } @override public equipmentdatacapture buildequipmentdatacapture() { return capture; } }
director类,可以简单理解为导演类:
package lims.designpatterndemo.builderdemo; public class equipmentdatacapturedirector { public equipmentdatacapture constructeqiupmentdatacapture(equipmentdatacapturebuilder builder){ builder.buildfilepath(); builder.buildequipmentdata(); equipmentdatacapture capture = builder.buildequipmentdatacapture(); return capture; } }
调用端示例:
package lims.designpatterndemo.builderdemo; public class builderdemo { public static void main(string[] args) { equipmentdatacapturedirector direcotr = new equipmentdatacapturedirector(); equipmentdatacapturebuilder builder = new pdffilecapturebuilder(); builder = new excelfilecapturebuilder(); equipmentdatacapture capture = direcotr.constructeqiupmentdatacapture(builder); system.out.println(capture.getequipmentdata()); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。