1.概述
建造者模式(Builder Pattern)又叫生成器模式,是一種對象構(gòu)建模式。它可以將復(fù)雜對象的建造過程抽象出來(抽象類別),使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對象。
- 建造者模式是一步一步創(chuàng)建一個(gè)復(fù)雜的對象,它允許用戶只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們,用戶不需要知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。
- 一個(gè)復(fù)雜的構(gòu)建與其表示(本身)相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。現(xiàn)在建造者模式主要用來通過鏈?zhǔn)秸{(diào)用生成不同的配置。
2.結(jié)構(gòu)
建造者(Builder)模式包含如下角色:
-
抽象建造者類(Builder):這個(gè)接口規(guī)定要實(shí)現(xiàn)復(fù)雜對象的那些部分的創(chuàng)建,并不涉及具體的部件對象的創(chuàng)建。
-
具體建造者類(ConcreteBuilder):實(shí)現(xiàn) Builder 接口,完成復(fù)雜產(chǎn)品的各個(gè)部件的具體創(chuàng)建方法。在構(gòu)造過程完成后,提供產(chǎn)品的實(shí)例。
-
產(chǎn)品類(Product):要?jiǎng)?chuàng)建的復(fù)雜對象。
-
指揮者類(Director):調(diào)用具體建造者來創(chuàng)建復(fù)雜對象的各個(gè)部分,在指導(dǎo)者中不涉及具體產(chǎn)品的信息,只負(fù)責(zé)保證對象各部分完整創(chuàng)建或按某種順序創(chuàng)建。
3.例子
//自行車類
public class Bike {
private String frame;
private String seat;
public String getFrame() {
return frame;
}
public void setFrame(String frame) {
this.frame = frame;
}
public String getSeat() {
return seat;
}
public void setSeat(String seat) {
this.seat = seat;
}
}
// 抽象 builder 類
public abstract class Builder {
protected Bike mBike = new Bike();
public abstract void buildFrame();
public abstract void buildSeat();
public abstract Bike createBike();
}
//摩拜單車Builder類
public class MobikeBuilder extends Builder {
@Override
public void buildFrame() {
mBike.setFrame("鋁合金車架");
}
@Override
public void buildSeat() {
mBike.setSeat("真皮車座");
}
@Override
public Bike createBike() {
return mBike;
}
}
//ofo單車Builder類
public class OfoBuilder extends Builder {
@Override
public void buildFrame() {
mBike.setFrame("碳纖維車架");
}
@Override
public void buildSeat() {
mBike.setSeat("橡膠車座");
}
@Override
public Bike createBike() {
return mBike;
}
}
//指揮者類
public class Director {
private Builder mBuilder;
public Director(Builder builder) {
mBuilder = builder;
}
public Bike construct() {
mBuilder.buildFrame();
mBuilder.buildSeat();
return mBuilder.createBike();
}
}
//測試類
public class Client {
public static void main(String[] args) {
showBike(new OfoBuilder());
showBike(new MobikeBuilder());
}
private static void showBike(Builder builder) {
Director director = new Director(builder);
Bike bike = director.construct();
System.out.println(bike.getFrame());
System.out.println(bike.getSeat());
}
}
我們也可以將抽象建造者和指揮者類進(jìn)行解和,簡化系統(tǒng)結(jié)構(gòu),但不符合開閉原則。
public abstract class Builder {
// 聲明Bike類型的變量,并進(jìn)行賦值
protected Bike bike = new Bike();
public abstract void buildFrame();
public abstract void buildSeat();
// 構(gòu)造自行車方法
public abstract Bike createBike();
public Bike construct() {
this.buildFrame();
this.buildSeat();
return this.createBike();
}
}
4.優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中,一般產(chǎn)品類和建造者類是比較穩(wěn)定的,因此,將主要的業(yè)務(wù)邏輯封裝在指揮者類中對整體而言可以取得比較好的穩(wěn)定性。
- 在建造者模式中,客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對象。
- 可以更加精細(xì)地控制產(chǎn)品的創(chuàng)建過程 。將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰,也更方便使用程序來控制創(chuàng)建過程。
- 建造者模式很容易進(jìn)行擴(kuò)展。如果有新的需求,通過實(shí)現(xiàn)一個(gè)新的建造者類就可以完成,基本上不用修改之前已經(jīng)測試通過的代碼,因此也就不會(huì)對原有功能引入風(fēng)險(xiǎn)。符合開閉原則。
缺點(diǎn):
- 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點(diǎn),其組成部分相似,如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制。
5.使用場景
建造者(Builder)模式創(chuàng)建的是復(fù)雜對象,其產(chǎn)品的各個(gè)部分經(jīng)常面臨著劇烈的變化,但將它們組合在一起的算法卻相對穩(wěn)定,所以它通常在以下場合使用。文章來源:http://www.zghlxwxcb.cn/news/detail-502156.html
- 創(chuàng)建的對象較復(fù)雜,由多個(gè)部件構(gòu)成,各部件面臨著復(fù)雜的變化,但構(gòu)件間的建造順序是穩(wěn)定的。
- 創(chuàng)建復(fù)雜對象的算法獨(dú)立于該對象的組成部分以及它們的裝配方式,即產(chǎn)品的構(gòu)建過程和最終的表示是獨(dú)立的。
6.擴(kuò)展方法
/**
* @author 曉風(fēng)殘?jiān)翷x
* @date 2023/6/26 16:52
* 手機(jī)類
*/
public class Phone {
private String cpu;
private String screen;
private String memory;
private String mainboard;
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", screen='" + screen + '\'' +
", memory='" + memory + '\'' +
", mainboard='" + mainboard + '\'' +
'}';
}
// 私有構(gòu)造方法
private Phone(Builder builder) {
this.cpu = builder.cpu;
this.screen = builder.screen;
this.memory = builder.memory;
this.mainboard = builder.mainboard;
}
public static final class Builder {
private String cpu;
private String screen;
private String memory;
private String mainboard;
public Builder cpu(String cpu) {
this.cpu = cpu;
return this;
}
public Builder screen(String screen) {
this.screen = screen;
return this;
}
public Builder memory(String memory) {
this.memory = memory;
return this;
}
public Builder mainboard(String mainboard) {
this.mainboard = mainboard;
return this;
}
// 使用構(gòu)建者創(chuàng)建phone對象
public Phone build() {
return new Phone(this);
}
}
}
/**
* @author 曉風(fēng)殘?jiān)翷x
* @date 2023/6/26 16:57
* 常用的構(gòu)建者用法 可以提高開發(fā)效率
*/
public class Client {
public static void main(String[] args) {
// 通過構(gòu)建者對象創(chuàng)建手機(jī)對象
Phone phone = new Phone.Builder()
.cpu("intel")
.screen("三星")
.memory("金士頓內(nèi)存條")
.mainboard("華碩")
.build();
System.out.println(phone);
}
}
在lombok的@Builder注解也能實(shí)現(xiàn)建造者模式,簡化開發(fā)。文章來源地址http://www.zghlxwxcb.cn/news/detail-502156.html
到了這里,關(guān)于Gof23設(shè)計(jì)模式之建造者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!