建造者模式
什么是建造者模式
建造者模式(Builder Pattern)是一種對(duì)象構(gòu)建的設(shè)計(jì)模式,它允許你通過一步一步地構(gòu)建一個(gè)復(fù)雜對(duì)象,來隱藏復(fù)雜對(duì)象的創(chuàng)建細(xì)節(jié)。
這種模式將一個(gè)復(fù)雜對(duì)象的構(gòu)建過程與其表示過程分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。命名建議以Builder結(jié)尾,以達(dá)到見名之意。
在建造者模式中,通常包含以下幾個(gè)角色:
- 產(chǎn)品(Product):這是最終要?jiǎng)?chuàng)建的對(duì)象,它通常包含多個(gè)屬性,并且可能具有復(fù)雜的內(nèi)部結(jié)構(gòu)。
- 抽象建造者(Builder):這是一個(gè)接口或者抽象類,定義了創(chuàng)建產(chǎn)品所需的方法。這些方法通常是一系列設(shè)置產(chǎn)品屬性的步驟。
- 具體建造者(ConcreteBuilder):這個(gè)類實(shí)現(xiàn)了抽象建造者接口,提供了構(gòu)建產(chǎn)品的具體實(shí)現(xiàn)。它包含了創(chuàng)建產(chǎn)品對(duì)象的所有邏輯,并可以一步步地設(shè)置產(chǎn)品對(duì)象的屬性。
- 導(dǎo)演者(Director):這是一個(gè)可選的角色,它負(fù)責(zé)調(diào)用建造者接口中的方法來構(gòu)建產(chǎn)品對(duì)象。導(dǎo)演者可以簡(jiǎn)化客戶端代碼,使得客戶端無需關(guān)心具體的構(gòu)建步驟。
使用場(chǎng)景
- 當(dāng)我們要建造一個(gè)復(fù)雜的產(chǎn)品。比如:手機(jī)時(shí)。這種復(fù)雜產(chǎn)品的創(chuàng)建,需要處理子組件裝配的問題。
- 實(shí)際開發(fā)中,我們所需要的對(duì)象構(gòu)建時(shí)也非常復(fù)雜,有很多步驟需要處理時(shí)。
建造者模式的本質(zhì)
- 分離了對(duì)象子組件的單獨(dú)構(gòu)造(有Buider來負(fù)責(zé))和裝配(有Director負(fù)責(zé))。從而可以構(gòu)造負(fù)責(zé)的對(duì)象。
- 這個(gè)模式適用于在某個(gè)對(duì)象構(gòu)建過程復(fù)雜的情況下使用。
- 由于實(shí)現(xiàn)了構(gòu)建和裝配的解耦。不同的構(gòu)建器,相同的裝配,可以做出不同的對(duì)象; 相同的構(gòu)建器,不同的裝配順序也可以做出不同的對(duì)象。也就是實(shí)現(xiàn)了構(gòu)建算法、裝配算法的解耦,實(shí)現(xiàn)了更好的復(fù)用。
案例
實(shí)現(xiàn)建造華為手機(jī)與小米手機(jī)
通過靜態(tài)內(nèi)部類作為建造者
Phone.java
public class Phone {
// 機(jī)身
private String fuselage;
// 攝像頭
private String camera;
// 系統(tǒng)內(nèi)核
private String systemKernel;
// 私有構(gòu)造方法,只能通過建造者創(chuàng)建
private Phone(Builder builder) {
this.fuselage = builder.fuselage;
this.camera = builder.camera;
this.systemKernel = builder.systemKernel;
}
@Override
public String toString() {
return "Phone{" +
"fuselage='" + fuselage + '\'' +
", camera='" + camera + '\'' +
", systemKernel='" + systemKernel + '\'' +
'}';
}
// 靜態(tài)內(nèi)部類作為建造者
static class Builder {
// 機(jī)身
private String fuselage;
// 攝像頭
private String camera;
// 系統(tǒng)內(nèi)核
private String systemKernel;
public Builder setFuselage(String fuselage) {
this.fuselage = fuselage;
return this; // 鏈?zhǔn)秸{(diào)用
}
public Builder setCamera(String camera) {
this.camera = camera;
return this; // 鏈?zhǔn)秸{(diào)用
}
public Builder setSystemKernel(String systemKernel) {
this.systemKernel = systemKernel;
return this; // 鏈?zhǔn)秸{(diào)用
}
// 創(chuàng)建手機(jī)
public Phone createPhone(){
return new Phone(this);
}
}
}
Client.java
public class Client {
public static void main(String[] args) {
Phone phone = new Phone.Builder()
.setCamera("華為攝像頭")
.setFuselage("華為機(jī)身")
.setSystemKernel("鴻蒙系統(tǒng)")
.createPhone();
System.out.println(phone);
Phone phone2 = new Phone.Builder()
.setCamera("小米攝像頭")
.setFuselage("小米機(jī)身")
.setSystemKernel("小米系統(tǒng)")
.createPhone();
System.out.println(phone2);
}
}
執(zhí)行結(jié)果:
通過接口實(shí)現(xiàn)建造者模式
UML
不使用導(dǎo)演者
Phone.java
public class Phone {
// 機(jī)身
private String fuselage;
// 攝像頭
private String camera;
// 系統(tǒng)內(nèi)核
private String systemKernel;
public void setFuselage(String fuselage) {
this.fuselage = fuselage;
}
public void setCamera(String camera) {
this.camera = camera;
}
public void setSystemKernel(String systemKernel) {
this.systemKernel = systemKernel;
}
@Override
public String toString() {
return "Phone{" +
"fuselage=" + fuselage +
", camera=" + camera +
", systemKernel=" + systemKernel +
'}';
}
}
IPhoneBuider.java
// 手機(jī) 抽象建造者定義接口
public interface IPhoneBuider {
// 設(shè)置機(jī)身
IPhoneBuider setFuselage(String fuselage);
// 設(shè)置攝像頭
IPhoneBuider setCamera(String camera);
// 設(shè)置系統(tǒng)內(nèi)核
IPhoneBuider setSystemKernel(String systemKernel);
// 返回創(chuàng)建對(duì)象
Phone buildPhone();
}
PhoneBuilder.java
// 建造者具體實(shí)現(xiàn)
public class PhoneBuilder implements IPhoneBuider {
// 定義建造者返回對(duì)象
private Phone phone;
public PhoneBuilder() {
// 初始化Phone
this.phone = new Phone();
}
@Override
public IPhoneBuider setFuselage(String fuselage) {
phone.setFuselage(fuselage);
return this;
}
@Override
public IPhoneBuider setCamera(String camera) {
phone.setCamera(camera);
return this;
}
@Override
public IPhoneBuider setSystemKernel(String systemKernel) {
phone.setSystemKernel(systemKernel);
return this;
}
@Override
public Phone buildPhone() {
return phone;
}
}
TestClient2.java
public class TestClient2 {
public static void main(String[] args) {
// 創(chuàng)建建造具體建造者
PhoneBuilder phoneBuilder = new PhoneBuilder();
Phone phone = phoneBuilder
.setCamera("裝配小米攝像頭")
.setFuselage("裝配小米機(jī)身")
.setSystemKernel("裝配小米系統(tǒng)")
.buildPhone();
System.out.println(phone.toString());
}
}
使用導(dǎo)演者
新增導(dǎo)演者
HuaweiDirector.java
// 華為手機(jī)導(dǎo)演者
public class HuaweiDirector {
// 定義建造者屬性
private IPhoneBuider phoneBuider;
public HuaweiDirector(IPhoneBuider phoneBuider) {
this.phoneBuider = phoneBuider;
}
public Phone createPhone(){
Phone phone = phoneBuider.setCamera("裝配華為攝像頭")
.setFuselage("裝配華為機(jī)身")
.setSystemKernel("裝配鴻蒙系統(tǒng)")
.buildPhone();
return phone;
}
}
TestClient.java
public class TestClient {
public static void main(String[] args) {
// 創(chuàng)建建造具體建造者
PhoneBuilder phoneBuilder = new PhoneBuilder();
// 創(chuàng)建導(dǎo)演者 傳入具體建造者
HuaweiDirector huaweiDirector = new HuaweiDirector(phoneBuilder);
// 通過導(dǎo)演者構(gòu)建手機(jī)
Phone phone = huaweiDirector.createPhone();
System.out.println(phone.toString());
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-852191.html
gitee源碼
git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git文章來源地址http://www.zghlxwxcb.cn/news/detail-852191.html
到了這里,關(guān)于03-JAVA設(shè)計(jì)模式-建造者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!