您好,登錄后才能下訂單哦!
小編給大家分享一下Java如何實(shí)現(xiàn)Builder建造者模式,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一、場景描述
建造者模式同工廠模式、抽象工廠模式一樣,用于創(chuàng)建繼承類對象。
工廠模式:Java設(shè)計(jì)模式之工廠模式
抽象工廠模式:Java設(shè)計(jì)模式之抽象工廠模式
所不同的是,工廠模式下,各子類實(shí)現(xiàn)接口,通過工廠類創(chuàng)建子類對象;而建造者模式下,各子類擁有其建造者類,通過它創(chuàng)建不同的父類對象,最終實(shí)現(xiàn)多態(tài),實(shí)際上子類、父類在代碼中是不存在的。
以儀器數(shù)據(jù)采集工具為例,工廠模式下,定義接口“儀器數(shù)據(jù)采集工具”,定義子類“PDF文件數(shù)據(jù)采集工具”和“Excel文件數(shù)據(jù)采集工具”,子類實(shí)現(xiàn)接口。通過工廠類(無論是靜態(tài)工廠類還是抽象工廠類),創(chuàng)建子類對象,這些對象擁有不同的表現(xiàn)方式,即為多態(tài)。
在建造者模式下,定義父類“儀器數(shù)據(jù)采集工具”,然后通過“PDF文件數(shù)據(jù)采集工具的建造者類”和“Excel文件數(shù)據(jù)采集工具的建造者類”來為“儀器數(shù)據(jù)采集工具”的類對象賦予不同的表現(xiàn)方式(為字段賦予不同的值等),最終實(shí)現(xiàn)多態(tài)。
建造者模式下,Director好比導(dǎo)演一般,它來調(diào)用建造者Builder完成對類對象的創(chuàng)建,調(diào)用者調(diào)用Director即可,如下圖所示:
當(dāng)然,工廠模式字面意義是用于創(chuàng)建對象,而建造者模式字面意義是建造不同的對象,兩者能實(shí)現(xiàn)類似的功能,但兩者的應(yīng)用場景大可不同。
工廠模式應(yīng)用于某簡單類對象的創(chuàng)建,而建造者模式應(yīng)用于復(fù)雜類對象的建造,具體可百度學(xué)習(xí)體會。
擴(kuò)展時(shí),例如新增Word文件數(shù)據(jù)采集,創(chuàng)建其Builder類即可,該類實(shí)現(xiàn)Word文件數(shù)據(jù)采集程序的創(chuàng)建工作;調(diào)用時(shí)使用WordBuilder類即可調(diào)用。
二、示例代碼
(父)類:
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數(shù)據(jù)采集建造者類:
package lims.designpatterndemo.builderdemo; public class PdfFileCaptureBuilder implements EquipmentDataCaptureBuilder{ // EquipmentDataCapture capture; //構(gòu)造 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數(shù)據(jù)采集建造者:
package lims.designpatterndemo.builderdemo; public class ExcelFileCaptureBuilder implements EquipmentDataCaptureBuilder{ // EquipmentDataCapture capture; //構(gòu)造 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類,可以簡單理解為導(dǎo)演類:
package lims.designpatterndemo.builderdemo; public class EquipmentDataCaptureDirector { public EquipmentDataCapture constructEqiupmentDataCapture(EquipmentDataCaptureBuilder builder){ builder.buildFilePath(); builder.buildEquipmentData(); EquipmentDataCapture capture = builder.buildEquipmentDataCapture(); return capture; } }
調(diào)用端示例:
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()); } }
以上是“Java如何實(shí)現(xiàn)Builder建造者模式”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。