目錄
一、基本概念
二、UML類圖
三、角色設(shè)計?
四、案例分析
五、總結(jié)
一、基本概念
建造者模式是一種創(chuàng)建型設(shè)計模式,它使我們將一個復(fù)雜對象的構(gòu)建步驟分離出來,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。該模式的目的是將構(gòu)建復(fù)雜對象的過程抽象化,從而減少代碼的重復(fù)和復(fù)雜度。
在建造者模式中,我們通過Builder接口或抽象類定義了一個標(biāo)準(zhǔn)的構(gòu)建流程,然后讓不同的具體構(gòu)造者按照這個標(biāo)準(zhǔn)來實(shí)現(xiàn)自己的構(gòu)建流程。同時,我們還定義了一個指導(dǎo)者(Director)類,用于按照特定的順序執(zhí)行構(gòu)建流程,從而完成對象的構(gòu)建。
二、UML類圖
三、角色設(shè)計?
角色 | 描述 |
---|---|
產(chǎn)品 | 被建造的復(fù)雜對象 |
抽象建造者 | 定義了一個創(chuàng)建產(chǎn)品各個子部件的抽象接口 |
具體建造者 | 實(shí)現(xiàn)Builder接口,構(gòu)建并組裝各個部件 |
指導(dǎo)者 | 調(diào)用建造者接口完成復(fù)雜對象的創(chuàng)建,隔離了客戶與對象的生產(chǎn)過程 |
四、案例分析
例如有如下一個場景:日常生活中手機(jī)也分為有基礎(chǔ)入門、中端和高端旗艦機(jī)三個檔次的手機(jī),客戶這時候提出了一個需求:我想購買一部基礎(chǔ)入門機(jī)和一部高端旗艦機(jī)!客戶是完全不需要知曉整部手機(jī)的生產(chǎn)過程,只需要傳達(dá)給指揮者,指揮者通過對應(yīng)的手機(jī)建造者去控制生產(chǎn)對應(yīng)的手機(jī)即可,下面我們通過代碼實(shí)現(xiàn)這個案例:
手機(jī)類:
包含了基礎(chǔ)的核心處理器、內(nèi)存和電池3個參數(shù)。
public class Phone {
private String cpu;
private String memory;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
public String getBattery() {
return battery;
}
public void setBattery(String battery) {
this.battery = battery;
}
private String battery;
}
建造者抽象類:
提供了一個基礎(chǔ)的手機(jī)對象,建造核心處理器,內(nèi)存和電池三個抽象方法,返回建造完畢的手機(jī)對象。
public abstract class Builder {
protected Phone phone = new Phone();
public abstract void buildCpu();
public abstract void buildMemory();
public abstract void buildBattery();
public Phone builder(){
return this.phone;
}
}
一個基礎(chǔ)手機(jī)實(shí)現(xiàn)抽象建造者類:
public class BasicPhoneBuilder extends Builder{
@Override
public void buildCpu() {
System.out.println("麒麟980");
phone.setCpu("麒麟980");
}
@Override
public void buildMemory() {
System.out.println("8G內(nèi)存");
phone.setMemory("8G內(nèi)存");
}
@Override
public void buildBattery() {
System.out.println("22.5W快充");
phone.setBattery("22.5W快充");
}
}
一個高端手機(jī)實(shí)現(xiàn)建造者抽象類:
public class AdvancedPhoneBuilder extends Builder{
@Override
public void buildCpu() {
System.out.println("麒麟9000");
phone.setCpu("麒麟9000");
}
@Override
public void buildMemory() {
System.out.println("12G內(nèi)存");
phone.setMemory("12G內(nèi)存");
}
@Override
public void buildBattery() {
System.out.println("66W快充");
phone.setBattery("66W快充");
}
}
創(chuàng)建一個指揮者,用于建造出不同類型手機(jī):
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;
}
public Phone builder(){
builder.buildCpu();
builder.buildMemory();
builder.buildBattery();
return builder.builder();
}
}
客戶端:
public class Client {
public static void main(String[] args) {
Builder basicPhoneBuilder = new BasicPhoneBuilder();
Phone basicPhone = new Director(basicPhoneBuilder).builder();
Builder advancedPhoneBuilder = new AdvancedPhoneBuilder();
Phone advancedPhone = new Director(advancedPhoneBuilder).builder();
}
}
運(yùn)行結(jié)果如下:
五、總結(jié)
優(yōu)點(diǎn):
1、將構(gòu)建復(fù)雜對象的過程封裝起來,簡化了代碼結(jié)構(gòu)和邏輯,客戶端不需要知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的過程可以創(chuàng)建出不同的產(chǎn)品對象。
2、每一個建造者都相對獨(dú)立,和其他建造者沒有關(guān)系,因此可以很方便的替換具體的建造者或者添加新的具體建造者,客戶端使用不同的建造者可以獲得不同的產(chǎn)品對象,系統(tǒng)擴(kuò)展方便,符合“開閉原則”。
缺點(diǎn):
1、添加新的部件需要修改抽象類和具體構(gòu)造者的代碼。
2、建造者模式所創(chuàng)建的產(chǎn)品都有很多的共同之處,組成部分相似,如果產(chǎn)品之間的差異性很大,則組成部分不同,不適合使用建造者模式,因此范圍很局限。
應(yīng)用場景:
1、相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時。
2、多個部件或零件,都可以裝配到一個對象中,但是產(chǎn)生的運(yùn)行結(jié)果又不相同時。
3、產(chǎn)品類非常復(fù)雜,或者產(chǎn)品類中的調(diào)用順序不同產(chǎn)生了不同的效能。
4、初始化一個對象消耗的資源非常大,則可以通過建造者模式分步初始化。
符合的設(shè)計原則:
1、單一職責(zé)原則(Single Responsibility Principle)
建造者僅負(fù)責(zé)構(gòu)建產(chǎn)品,產(chǎn)品僅負(fù)責(zé)描述自身,職責(zé)單一。
2、開閉原則(Open Closed Principle)
可以新增建造者而不影響已有代碼,符合開閉原則。
3、里氏替換原則(Liskov Substitution Principle)
擴(kuò)展新的建造者仍遵循相同接口,不影響客戶端使用。
4、依賴倒轉(zhuǎn)原則(Dependency Inversion Principle)
建造者和指揮者依賴抽象接口,不依賴具體實(shí)現(xiàn)類。
5、接口隔離原則(Interface Segregation Principle)
產(chǎn)品接口和建造者接口職責(zé)單一,不會強(qiáng)迫實(shí)現(xiàn)不需要的方法。文章來源:http://www.zghlxwxcb.cn/news/detail-552371.html
建造者模式將復(fù)雜對象的構(gòu)建與表示分離,使得相同的構(gòu)建過程可以創(chuàng)建不同表示。它是一步一步創(chuàng)建一個復(fù)雜對象的最佳模式。文章來源地址http://www.zghlxwxcb.cn/news/detail-552371.html
到了這里,關(guān)于Java設(shè)計模式之創(chuàng)建型-建造者模式(UML類圖+案例分析)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!