java設(shè)計(jì)模式--建造者模式詳解
引例
需求:建造房子,建造過程包括打地基、砌墻和封頂。房子各式各樣,包括平房和別墅,編程模擬實(shí)現(xiàn)。
一般解法
思路:定義房子類,包括建房的方法,然后定義平房和別墅繼承房子類,重寫相關(guān)方法。
類圖:

代碼:
AbstractHouse(房子)
public abstract class AbstractHouse {
public abstract void buildBasic();//打地基
public abstract void buildWalls();//砌墻
public abstract void buildRoof();//封頂
public void build() { //建房
buildBasic(); //三個(gè)步驟(注意順序)
buildWalls();
buildRoof();
}
}
Bungalow(平房)
public class Bungalow extends AbstractHouse{
@Override
public void buildBasic() {
System.out.println("平房打地基");
}
@Override
public void buildWalls() {
System.out.println("平房砌墻");
}
@Override
public void buildRoof() {
System.out.println("平房封頂");
}
}
Villa (別墅)
public class Villa extends AbstractHouse{
@Override
public void buildBasic() {
System.out.println("別墅打地基");
}
@Override
public void buildWalls() {
System.out.println("別墅砌墻");
}
@Override
public void buildRoof() {
System.out.println("別墅封頂");
}
}
客戶端調(diào)用
public class Client {
public static void main(String[] args) {
Bungalow bungalow = new Bungalow();
bungalow.build();
Villa villa = new Villa();
villa.build();
}
}
運(yùn)行結(jié)果:

缺點(diǎn):
程序不好擴(kuò)展和維護(hù),把產(chǎn)品和創(chuàng)建產(chǎn)品過程封裝在一起,耦合性高。
解耦產(chǎn)品和創(chuàng)建產(chǎn)品過程=》建造者模式
建造者模式
建造者模式(Builder Pattern)又叫生成器模式,是一種對(duì)象構(gòu)建模式。它可以將復(fù)雜對(duì)象的建造過程抽象出來(抽象類別),使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對(duì)象。
一步一步創(chuàng)建一個(gè)復(fù)雜的對(duì)象,允許用戶只通過指定復(fù)雜對(duì)象的類型和內(nèi)容就可以構(gòu)建它們,而不需要知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。
類圖:

- Product(產(chǎn)品): 具體的產(chǎn)品對(duì)象
- Builder(抽象建造者): 創(chuàng)建一個(gè)產(chǎn)品對(duì)象的各個(gè)部件指定的接口/抽象類。
- ConcreteBuilder(具體建造者): 實(shí)現(xiàn)接口,構(gòu)建和裝配各個(gè)部件。
- Director(指揮者): 構(gòu)建一個(gè)使用Builder接口的對(duì)象,負(fù)責(zé)控制產(chǎn)品對(duì)象的生產(chǎn)過程,隔離了客戶與對(duì)象的生產(chǎn)過程。
建造者模式解法
代碼:
House類(Product產(chǎn)品)
public class House {
private String baise;
private String wall;
private String roof;
}
HouseBuilder類(Builder抽象建造者)
public abstract class HouseBuilder {
protected House house = new House();
//將建造的流程寫好, 抽象的方法
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void buildRoof();
//建造房子好, 將產(chǎn)品(房子) 返回
public House buildHouse() {
return house;
}
}
3.Bungalow類(ConcreteBuilder具體建造者A)
public class Bungalow extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("平房打地基");
}
@Override
public void buildWalls() {
System.out.println("平房砌墻");
}
@Override
public void buildRoof() {
System.out.println("平房封頂");
}
}
4.Villa類(ConcreteBuilder具體建造者B)
public class Villa extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("別墅打地基");
}
@Override
public void buildWalls() {
System.out.println("別墅砌墻");
}
@Override
public void buildRoof() {
System.out.println("別墅封頂");
}
}
5.HouseDirector類(Director指揮者)
public class HouseDirector {
HouseBuilder houseBuilder = null;
//構(gòu)造器傳入 houseBuilder
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//通過setter 傳入 houseBuilder
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//如何處理建造房子的流程,交給指揮者
public House constructHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.buildRoof();
return houseBuilder.buildHouse();
}
}
客戶端調(diào)用
public class Client {
public static void main(String[] args) {
//蓋平房
Bungalow commonHouse = new Bungalow();
//準(zhǔn)備創(chuàng)建房子的指揮者
HouseDirector houseDirector = new HouseDirector(commonHouse);
//完成蓋房子,返回產(chǎn)品(普通房子)
House house = houseDirector.constructHouse();
System.out.println("--------------------------");
//蓋別墅
Villa highBuilding = new Villa();
//重置建造者
houseDirector.setHouseBuilder(highBuilding);
//完成蓋房子,返回產(chǎn)品(高樓)
houseDirector.constructHouse();
}
}
運(yùn)行結(jié)果:

總結(jié)
- 客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對(duì)象。
- 將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰。
- 使用不同的具體建造者即可得到不同的產(chǎn)品對(duì)象。
- 增加新的具體建造者無須修改原有代碼。
- 若產(chǎn)品間的差異很大,則不適合使用建造者模式。
- 抽象工廠模式VS建造者模式
抽象工廠模式是對(duì)產(chǎn)品家族的創(chuàng)建,一個(gè)產(chǎn)品家族是一系列產(chǎn)品:具有不同分類維度的產(chǎn)品組合,采用抽象工廠模式不需要關(guān)心構(gòu)建過程,只關(guān)心什么產(chǎn)品由什么工廠生產(chǎn)即可。
而建造者模式則是要求按照指定的藍(lán)圖建造產(chǎn)品,它的主要目的是通過組裝零配件而產(chǎn)生一個(gè)新產(chǎn)品。
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java OpenCV利用KNN算法實(shí)現(xiàn)圖像背景移除
這篇文章主要為大家介紹了Java OpenCV利用K最鄰近(KNN,K-NearestNeighbor)分類算法實(shí)現(xiàn)圖像背景移除的示例代碼,需要的可以參考一下2022-01-01
Java中java.lang.ClassCastException異常原因以及解決方法詳解
這篇文章主要給大家介紹了關(guān)于Java中java.lang.ClassCastException異常原因以及解決方法的相關(guān)資料,ClassCastException從字面上看是類型轉(zhuǎn)換錯(cuò)誤,通常是進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)候出的錯(cuò)誤,需要的朋友可以參考下2024-02-02
Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建實(shí)例
下面小編就為大家?guī)硪黄狹aven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解決
這篇文章主要介紹了詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(獨(dú)占模式)
這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Java用Arrays.asList初始化ArrayList實(shí)例方法
在本篇文章里小編給大家分享的是關(guān)于Java中使用Arrays.asList初始化ArrayList的知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。2019-10-10
Java查詢時(shí)間段(startTime--endTime)間的數(shù)據(jù)方式
這篇文章主要介紹了Java查詢時(shí)間段(startTime--endTime)間的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

