java開發(fā)建造者模式驗(yàn)證實(shí)例詳解
引言
創(chuàng)建一個(gè)類的實(shí)例,我們通常使用類中構(gòu)造函數(shù)來完成對(duì)象的初始化,如果一個(gè)對(duì)象構(gòu)造過程很復(fù)雜,如果將構(gòu)造過程和對(duì)象使用的過程放在一起,就顯得這個(gè)類很笨重,職責(zé)也不單一,最好的解決辦法就是將構(gòu)造過程拿出來單獨(dú)進(jìn)行封裝,類的使用單獨(dú)封裝一個(gè)類就會(huì)好很多。如:mybaits中的SqlSessionFactoryBulider和SqlSessionFactory兩個(gè)類,下圖為SqlSessionFactoryBulider和SqlSessionFactory兩個(gè)類提供的方法。前者職責(zé)是根據(jù)mybaits的配置文件(配置文件很復(fù)雜,構(gòu)造過程更復(fù)雜)構(gòu)造SqlSessionFactory實(shí)例對(duì)象,后者職責(zé)是SqlSessionFactory專注于的各種情況的下SqlSession的生成。
經(jīng)典再現(xiàn)
建造者模式將對(duì)象的創(chuàng)建和對(duì)象的表示分開,使用同樣的建造過程可以建造出不同的對(duì)象表示,一下我們使用計(jì)算機(jī)的生產(chǎn)過程為例,介紹建造者模式。計(jì)算機(jī)可以用來上網(wǎng)、辦公、娛樂等這個(gè)是計(jì)算機(jī)這個(gè)對(duì)象本身要提供給我們的功能(我們可以稱為對(duì)象表示) 我們稱其為computer。其構(gòu)造包括安裝主板、安裝CPU、安裝硬盤、網(wǎng)卡等構(gòu)造過程,我們稱之為bulider,假設(shè)聯(lián)想計(jì)算機(jī)和dell計(jì)算機(jī)具體的安裝方法上有差別,因此我們有LenovoBulider和DellBulider兩個(gè)具體的實(shí)現(xiàn)類,這個(gè)兩個(gè)類及bulider更關(guān)注具體的建造方法,我們?cè)俜庋b一個(gè)類,調(diào)用這些建造方法完成完成產(chǎn)品的構(gòu)建,就產(chǎn)生了我們經(jīng)典的建造者模式。上例類圖如下:
產(chǎn)品Computer 示例代碼如下:
public class Computer { private String hardDisk ; private String CPU; private String mainboard ; public void setHardDisk(String hardDisk) { this.hardDisk = hardDisk; } public void setCPU(String CPU) { this.CPU = CPU; } public void setMainboard(String mainboard) { this.mainboard = mainboard; } public void start() { System.out.println(hardDisk+" "+CPU+" "+ mainboard +" 辦公"); } public void work() { System.out.println(hardDisk+" "+CPU+" "+ mainboard +" 辦公"); } public void play() { System.out.println(hardDisk+" "+CPU+" "+ mainboard +" 娛樂"); } }
抽象的建造者,把可變部分延遲到子類進(jìn)行
public abstract class ComputerBulider { protected Computer acomputer = new Computer(); public abstract void buildCPU(); public abstract void buildHardDisk(); public abstract void buildMainboard(); //關(guān)鍵代碼需要返回一個(gè)產(chǎn)品的對(duì)象 public Computer getComputer(){ return acomputer; } }
兩個(gè)具體的建造者,完成那些不同建造方法的具體實(shí)現(xiàn),代碼如下
public class DellBulider extends ComputerBulider { @Override public void buildCPU() { acomputer.setCPU("dell CPU"); } @Override public void buildHardDisk() { acomputer.setHardDisk("dell 硬盤"); } @Override public void buildMainboard() { acomputer.setMainboard("dell 主板"); } } public class LenovoBulider extends ComputerBulider { @Override public void buildCPU() { acomputer.setCPU("聯(lián)想 CPU"); } @Override public void buildHardDisk() { acomputer.setHardDisk("聯(lián)想 硬盤"); } @Override public void buildMainboard() { acomputer.setMainboard("聯(lián)想 主板"); } }
指揮者,總體包裝師代碼如下:
//指揮者,接收指令安排建造者根據(jù)一定的工序去制作產(chǎn)品 public class Director { private ComputerBulider computerBuilder; public Director(ComputerBulider comBuilder) { this.computerBuilder = comBuilder; } public Computer construct(){ //安裝主板 computerBuilder.buildMainboard(); //安裝cpu computerBuilder.buildCPU(); //安裝硬盤 computerBuilder.buildHardDisk(); //準(zhǔn)備完畢,返回一個(gè)完整的計(jì)算機(jī)給調(diào)用者 return computerBuilder.getComputer(); } }
巧妙之處,在于通過構(gòu)造注入的方式,將具體的建造者對(duì)象傳入,按照流程化方式建造了一個(gè)完整的對(duì)象。
通過代碼我們可以想象如果要生產(chǎn)一臺(tái)華碩計(jì)算機(jī),我們只需要擴(kuò)展一個(gè)華碩的具體bulider即可,原有的代碼完全不用動(dòng),符合開閉原則。另外我們指揮者類中只出現(xiàn)抽象的bulider,具體bulider完全可以替換它,符合里氏替換原則。當(dāng)然每個(gè)類各司其職,職責(zé)清晰,滿足單一職責(zé)原則。
建造者模式優(yōu)點(diǎn)及應(yīng)用場景
優(yōu)點(diǎn):客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對(duì)象;每一個(gè)具體建造者都相對(duì)獨(dú)立,而與其他的具體建造者無關(guān);可以更加精細(xì)地控制產(chǎn)品的創(chuàng)建過程。
應(yīng)用場景:建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點(diǎn),其組成部分相似,如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式
工廠方法模式和建造者模式區(qū)別
工廠方法模式輸出的是產(chǎn)品;而建造者模式中的builder輸出的是一個(gè)個(gè)零部件,再由指揮者進(jìn)行包裝形成產(chǎn)品。建造者模式更加關(guān)注與零件裝配的順序
拓展與總結(jié)
只要符合將對(duì)象的創(chuàng)建和對(duì)象的表示分離,就屬于建造者模式。建造者模式在實(shí)際使用中有很多變種,如JDK中StringBulider及mybatis中SqlSessionFactoryBulider,就沒有指揮者,但是也隸屬于建造模式,在使用過程中需要我們根據(jù)概念活學(xué)活用。在實(shí)際開發(fā)中,建造者模式又經(jīng)常和工廠模式結(jié)合使用。
以上就是java開發(fā)建造者模式驗(yàn)證實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于java建造者模式驗(yàn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java遞歸設(shè)置層級(jí)菜單的實(shí)現(xiàn)
本文主要介紹了java遞歸設(shè)置層級(jí)菜單的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08SpringBoot validator參數(shù)驗(yàn)證restful自定義錯(cuò)誤碼響應(yīng)方式
這篇文章主要介紹了SpringBoot validator參數(shù)驗(yàn)證restful自定義錯(cuò)誤碼響應(yīng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java權(quán)重隨機(jī)的實(shí)現(xiàn)方法
這篇文章主要介紹了Java權(quán)重隨機(jī)的實(shí)現(xiàn)方法,實(shí)例分析了權(quán)重隨機(jī)算法的原理與完整實(shí)現(xiàn)方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01Spring MVC中使用Google kaptcha驗(yàn)證碼的方法詳解
kaptcha 是一個(gè)非常實(shí)用的驗(yàn)證碼生成工具。有了它,你可以生成各種樣式的驗(yàn)證碼,因?yàn)樗强膳渲玫模旅孢@篇文章主要給大家介紹了關(guān)于Spring MVC中使用Google kaptcha驗(yàn)證碼的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10Java實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃背包問題
本文主要介紹使用java實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃的背包問題,詳細(xì)使用圖文和多種案例進(jìn)行解析,幫助理解該算法2021-06-06解決idea spring boot 修改html等不重啟即時(shí)生效的問題
這篇文章主要介紹了解決idea spring boot 修改html等不重啟即時(shí)生效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02