在日常的開發(fā)工作中,我們常常需要創(chuàng)建一些復(fù)雜的對象。這些對象可能包含許多不同的屬性,并且這些屬性的初始化過程可能相當復(fù)雜。在這種情況下,建造者模式是一種非常有用的設(shè)計模式,因為它允許我們分步驟地創(chuàng)建復(fù)雜的對象。
概念和原理:
建造者模式(Builder Pattern)是一種創(chuàng)建型設(shè)計模式,它用于構(gòu)建復(fù)雜的對象。這種模式通常用于構(gòu)建具有許多屬性的對象,并且允許用戶通過使用一組流暢的API逐個設(shè)置這些屬性,而不是通過使用大量的構(gòu)造函數(shù)參數(shù)去設(shè)置。
它的工作原理就是將復(fù)雜對象的構(gòu)建與其表示分離。這說明我們可以使用一個建造者對象來創(chuàng)建和配置一個復(fù)雜的對象,而不需要了解這個復(fù)雜對象的內(nèi)部工作原理。這樣可以使代碼更加靈活,更容易維護和擴展。
一、代碼示例
1.1 普通使用
我們先定義一個“手機”類,這個對象有許多屬性,比如品牌、內(nèi)存、價格等… 并且每個屬性對對象的構(gòu)建過程都有特定的要求。我們可以使用建造者模式來逐步構(gòu)建和配置這個對象。
public class Phone {
// 品牌
private String brand;
// 內(nèi)存
private String memory;
// 價格
private int price;
private Phone(Builder builder) {
this.brand= builder.brand;
this.memory = builder.memory;
this.price= builder.price;
}
public static class Builder {
private String brand;
private String memory;
private int price;
public Builder setBrand(String brand) {
this.brand= brand;
return this; // 返回當前對象,以便進行鏈式調(diào)用
}
public Builder setMemory(String memory) {
if (memory!= null && !memory.isEmpty()) { // 驗證memory是否有效
this.memory= memory;
} else {
throw new IllegalArgumentException("Invalid memory specification");
}
return this;
}
public Builder setPrice(int price) {
if (price> 0) { // 驗證price是否有效
this.price= price;
} else {
throw new IllegalArgumentException("price must be greater than 0");
}
return this;
}
public Phone build() {
return new Phone(this);
}
}
// 省略getter和setter方法...
}
現(xiàn)在,我們可以使用建造者模式來創(chuàng)建“手機”對象:
Phone phone = new Phone.Builder()
.setBrand("小米")
.setMemory("512G")
.setPrice(2999)
.build();
這樣,我們就可以通過鏈式調(diào)用的方式逐步設(shè)置和構(gòu)建“電腦”對象,并驗證每個屬性的有效性。此外,通過將構(gòu)建過程封裝在建造者類中,我們可以更加靈活地改變對象的創(chuàng)建過程,而不需要去修改表示的代碼。
1.2 使用lombok
這就不得不請出我們java開發(fā)的必備神器了哈哈,Lombok
是一個Java庫,它可以通過注解自動創(chuàng)建getter、setter、equals、hashCode和toString方法,從而減少模板代碼的數(shù)量。Lombok也可以與建造者模式可以一起使用,以進一步簡化代碼:
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class Phone {
private String brand;
private String memory;
private int price;
}
我們使用了Lombok的@Data
注解來自動生成getter、setter等方法。@Builder
注解告訴Lombok生成一個建造者類,該類具有與Phone類相同的屬性,并提供鏈式調(diào)用的方法來設(shè)置這些屬性。
然后我們可以和前面一樣創(chuàng)建“手機”對象:
Phone phone = new Phone.Builder()
.setBrand("蘋果")
.setMemory("512G")
.setPrice(8999)
.build();
因為@Builder
注解會自動為Phone類生成一個名為PhoneBuilder的靜態(tài)內(nèi)部類,該類具有與原始類相同的屬性,并且每個屬性都有一個返回此構(gòu)建器的方法。所以這使得我們可以使用鏈式調(diào)用方式來設(shè)置屬性并構(gòu)建對象。文章來源:http://www.zghlxwxcb.cn/news/detail-702227.html
二、使用建造者模式的好處
- 鏈式調(diào)用: 建造者模式允許我們通過鏈式調(diào)用的方式來設(shè)置對象的屬性,這使得代碼更加清晰和易于閱讀。
- 易于維護: 如果對象具有很多屬性,并且這些屬性的初始化過程很復(fù)雜,那么使用建造者模式可以使得代碼更加模塊化,更容易理解和維護。
- 分離對象構(gòu)造和表示: 建造者模式將對象的構(gòu)造和表示分離開來,使得我們可以靈活地改變對象的創(chuàng)建過程,而不需要去修改表示的代碼。
三、使用注意事項
- 對于簡單的對象,使用建造者模式可能會過度復(fù)雜化代碼,所以在決定是否使用建造者模式時,需要權(quán)衡利弊。
- 需要注意避免在建造者模式中產(chǎn)生不必要的代碼重復(fù)。比如,如果不同的方法需要使用相同的屬性,那么應(yīng)該避免在每個方法中都重復(fù)創(chuàng)建相同的屬性。
四、總結(jié)
建造者模式是一種非常有用的設(shè)計模式,尤其適用于創(chuàng)建具有很多屬性的復(fù)雜對象。通過鏈式調(diào)用的方式來設(shè)置對象的屬性,使得代碼更加清晰和易于閱讀。同時,將對象的構(gòu)造和表示分離開來,使得我們可以靈活地改變對象的創(chuàng)建過程。然而,對于簡單的對象,使用建造者模式可能會過度復(fù)雜化代碼,因此在使用時需要權(quán)衡利弊??偟膩碚f,掌握好建造者模式,可以讓我們的代碼更加清晰、易于維護和理解,快使用起來吧 ~文章來源地址http://www.zghlxwxcb.cn/news/detail-702227.html
到了這里,關(guān)于Java設(shè)計模式之建造者模式詳解(Builder Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!