java開發(fā)建造者模式驗證實例詳解
引言
創(chuàng)建一個類的實例,我們通常使用類中構造函數(shù)來完成對象的初始化,如果一個對象構造過程很復雜,如果將構造過程和對象使用的過程放在一起,就顯得這個類很笨重,職責也不單一,最好的解決辦法就是將構造過程拿出來單獨進行封裝,類的使用單獨封裝一個類就會好很多。如:mybaits中的SqlSessionFactoryBulider和SqlSessionFactory兩個類,下圖為SqlSessionFactoryBulider和SqlSessionFactory兩個類提供的方法。前者職責是根據(jù)mybaits的配置文件(配置文件很復雜,構造過程更復雜)構造SqlSessionFactory實例對象,后者職責是SqlSessionFactory專注于的各種情況的下SqlSession的生成。


經典再現(xiàn)
建造者模式將對象的創(chuàng)建和對象的表示分開,使用同樣的建造過程可以建造出不同的對象表示,一下我們使用計算機的生產過程為例,介紹建造者模式。計算機可以用來上網、辦公、娛樂等這個是計算機這個對象本身要提供給我們的功能(我們可以稱為對象表示) 我們稱其為computer。其構造包括安裝主板、安裝CPU、安裝硬盤、網卡等構造過程,我們稱之為bulider,假設聯(lián)想計算機和dell計算機具體的安裝方法上有差別,因此我們有LenovoBulider和DellBulider兩個具體的實現(xiàn)類,這個兩個類及bulider更關注具體的建造方法,我們再封裝一個類,調用這些建造方法完成完成產品的構建,就產生了我們經典的建造者模式。上例類圖如下:

產品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 +" 娛樂");
}
}
抽象的建造者,把可變部分延遲到子類進行
public abstract class ComputerBulider {
protected Computer acomputer = new Computer();
public abstract void buildCPU();
public abstract void buildHardDisk();
public abstract void buildMainboard();
//關鍵代碼需要返回一個產品的對象
public Computer getComputer(){
return acomputer;
}
}
兩個具體的建造者,完成那些不同建造方法的具體實現(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ù)一定的工序去制作產品
public class Director {
private ComputerBulider computerBuilder;
public Director(ComputerBulider comBuilder) {
this.computerBuilder = comBuilder;
}
public Computer construct(){
//安裝主板
computerBuilder.buildMainboard();
//安裝cpu
computerBuilder.buildCPU();
//安裝硬盤
computerBuilder.buildHardDisk();
//準備完畢,返回一個完整的計算機給調用者
return computerBuilder.getComputer();
}
}
巧妙之處,在于通過構造注入的方式,將具體的建造者對象傳入,按照流程化方式建造了一個完整的對象。
通過代碼我們可以想象如果要生產一臺華碩計算機,我們只需要擴展一個華碩的具體bulider即可,原有的代碼完全不用動,符合開閉原則。另外我們指揮者類中只出現(xiàn)抽象的bulider,具體bulider完全可以替換它,符合里氏替換原則。當然每個類各司其職,職責清晰,滿足單一職責原則。
建造者模式優(yōu)點及應用場景
優(yōu)點:客戶端不必知道產品內部組成的細節(jié),將產品本身與產品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產品對象;每一個具體建造者都相對獨立,而與其他的具體建造者無關;可以更加精細地控制產品的創(chuàng)建過程。
應用場景:建造者模式所創(chuàng)建的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,則不適合使用建造者模式
工廠方法模式和建造者模式區(qū)別
工廠方法模式輸出的是產品;而建造者模式中的builder輸出的是一個個零部件,再由指揮者進行包裝形成產品。建造者模式更加關注與零件裝配的順序
拓展與總結
只要符合將對象的創(chuàng)建和對象的表示分離,就屬于建造者模式。建造者模式在實際使用中有很多變種,如JDK中StringBulider及mybatis中SqlSessionFactoryBulider,就沒有指揮者,但是也隸屬于建造模式,在使用過程中需要我們根據(jù)概念活學活用。在實際開發(fā)中,建造者模式又經常和工廠模式結合使用。
以上就是java開發(fā)建造者模式驗證實例詳解的詳細內容,更多關于java建造者模式驗證的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot基于JAXB實現(xiàn)天地圖路徑規(guī)劃結果XML轉JSON
這篇文章主要為大家詳細介紹了SpringBoot如何基于JAXB實現(xiàn)將天地圖路徑規(guī)劃結果XML轉JSON功能,文中的示例代碼講解詳細,需要的可以了解下2025-02-02
Array?Index?Out?of?Bounds:數(shù)組越界錯誤解決方案及調試技巧
數(shù)組越界訪問是指訪問數(shù)組中超出其有效索引范圍的元素,這是一種常見的編程錯誤,可能導致程序崩潰或數(shù)據(jù)損壞,下面這篇文章主要給大家介紹了關于Array?Index?Out?of?Bounds:數(shù)組越界錯誤解決方案及調試技巧的相關資料,需要的朋友可以參考下2024-08-08
Java如何實現(xiàn)支付寶電腦支付基于servlet版本
這篇文章主要介紹了Java如何實現(xiàn)支付寶電腦支付基于servlet版本,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11
使用SpringBoot與Thrift實現(xiàn)RPC通信的方式詳解
在微服務架構的世界里,服務間的通信機制選擇成為了關鍵決策之一,RPC因其簡潔、高效的特點備受青睞,本文將詳細探討如何利用Spring?Boot和Thrift框架構建RPC通信,讓讀者理解其內在原理及實現(xiàn)方式,需要的朋友可以參考下2023-10-10

