Java設(shè)計(jì)模式之-建造者模式
什么是建造者模式
建造者模式(Builder Pattern)是一種對(duì)象構(gòu)建設(shè)計(jì)模式,它可以將一個(gè)復(fù)雜對(duì)象的構(gòu)建邏輯與其表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。該模式是為了將構(gòu)造復(fù)雜對(duì)象的過程和它的部件解耦。
主要解決什么問題
建造者模式主要解決了在軟件系統(tǒng)中,有時(shí)存在著復(fù)雜對(duì)象的創(chuàng)建工作,其通常由多個(gè)部分的組裝和步驟組成。與其他創(chuàng)建型模式相比,建造者模式更注重一步步創(chuàng)建復(fù)雜對(duì)象的過程。
在什么時(shí)候我們需要使用建造者模式
當(dāng)我們需要?jiǎng)?chuàng)建的對(duì)象非常復(fù)雜,包含多個(gè)組成部分,并且對(duì)象的創(chuàng)建需要一系列的步驟時(shí),我們通常會(huì)選擇使用建造者模式。
生活中的應(yīng)用實(shí)例
一個(gè)很好的例子是在吃快餐時(shí),我們通常會(huì)選擇一個(gè)套餐,這個(gè)套餐包含漢堡、薯?xiàng)l和飲料。盡管每個(gè)部分的制作過程可能有所不同,但是我們不必關(guān)心這些細(xì)節(jié),只需要選擇我們想要的套餐類型即可。
優(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ú)立,可以很方便地替換或增加新的建造者,用戶使用不同的具體建造者即可得到不同的產(chǎn)品對(duì)象。
缺點(diǎn)
建造者模式所創(chuàng)建的產(chǎn)品一般有較多的共同點(diǎn),其組成部分相似,如果產(chǎn)品之間的差異性很大,例如不同的部件,建造者模式可能無法滿足需求。
使用場景
建造者模式通常在以下場景中使用:
需要生成的產(chǎn)品對(duì)象有復(fù)雜的內(nèi)部結(jié)構(gòu),這些產(chǎn)品對(duì)象通常包含多個(gè)部分。
需要生成的產(chǎn)品對(duì)象的屬性相互依賴,建造者模式可以強(qiáng)制進(jìn)行一步步的構(gòu)造過程,不允許跳過必要的步驟。
代碼舉例
java
Copy
public class Burger {
? ? private String size;
? ? private boolean cheese;
? ? private boolean pepperoni;
? ? private boolean lettuce;
? ? private boolean tomato;
? ? public Burger(BurgerBuilder builder) {
? ? ? ? this.size = builder.size;
? ? ? ? this.cheese = builder.cheese;
? ? ? ? this.pepperoni = builder.pepperoni;
? ? ? ? this.lettuce = builder.lettuce;
? ? ? ? this.tomato = builder.tomato;
? ? }
? ? // getters and toString()...
}
public class BurgerBuilder {
? ? public String size;
? ? public boolean cheese = false;
? ? public boolean pepperoni = false;
? ? public boolean lettuce = false;
? ? public boolean tomato = false;
? ? public BurgerBuilder(String size) {
? ? ? ? this.size = size;
? ? }
? ? public BurgerBuilder addCheese() {
? ? ? ? this.cheese = true;
? ? ? ? return this;
? ? }
? ? public BurgerBuilder addPepperoni() {
? ? ? ? this.pepperoni = true;
? ? ? ? return this;
? ? }
? ? public BurgerBuilder addLettuce() {
? ? ? ? this.lettuce = true;
? ? ? ? return this;
? ? }
? ? public BurgerBuilder addTomato() {
? ? ? ? this.tomato = true;
? ? ? ? return this;
? ? }
? ? public Burger build() {
? ? ? ? return new Burger(this);
? ? }
}
public class Main {
? ? public static void main(String[] args) {
? ? ? ? Burger burger = new BurgerBuilder("Large")
? ? ? ? ? ? ? ? .addPepperoni()
? ? ? ? ? ? ? ? .addLettuce()
? ? ? ? ? ? ? ? .addTomato()
? ? ? ? ? ? ? ? .build();
? ? ? ? System.out.println(burger);
? ? }
}
在這個(gè)例子中,BurgerBuilder 就是一個(gè)建造者,它負(fù)責(zé)創(chuàng)建 `
Burger對(duì)象。通過鏈?zhǔn)秸{(diào)用方法,我們可以自由地添加我們想要的組件(例如,addPepperoni()、addLettuce()、addTomato()),然后調(diào)用 build() 方法就可以得到一個(gè) Burger 對(duì)象。
這樣做的好處是,我們可以控制 Burger 對(duì)象的創(chuàng)建過程,同時(shí)不暴露其內(nèi)部的構(gòu)建細(xì)節(jié)。此外,如果我們想要?jiǎng)?chuàng)建一個(gè)稍微不同的 Burger,只需要更改一下構(gòu)建步驟即可。