一、場景描述
建造者模式同工廠模式、抽象工廠模式一樣,用於創建繼承類對象。
工廠模式: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()); }}以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。