java设计模式建造_Java设计模式——建造模式(Builder Pattern)
Builder模式常用例子
今天就簡單粗暴的介紹一下Builder模式概念和使用。
Dialog的創建
AlertDialog dialog = new AlertDialog.Builder(this)
.setIcon(R.mipmap.ic_launcher)
.setMessage("Hello World")
.setTitle("Dialog")
.create();
dialog.show();
OkHttp Request的創建
Request request = new Request.Builder()
.url("https://github.com/hongyangAndroid")
.build();
1
2
3
Builder模式的好處/優點
客戶端代碼的可用性和可讀性得到了大大提高。與此同時,構造函數的參數數量明顯減少調用起來非常直觀。【不然創建dialog構造函數時new AlertDialog(R.mipmap.ic_launcher,"Hello World","Dialog","How are you"),參數數量多的話客戶端感覺就是黑人問號】,在提高代碼可讀性的同時,使用IDE提供的代碼補全功能也更加容易。
Builder例子
下面舉個關于麥當勞點餐的栗子
public class McFood {
private int totalCount; //份數
private boolean addIce; //飲料是否去冰
private Hamburg hamburg; //漢堡包
private Drink drink; //飲品
private String remark; //備注
private boolean takeOut; //是否外帶
public static class Hamburg {//漢堡包類
public static final String HAMBURG_CHICKEN = "chicken";
public static final String HAMBURG_BEEF = "beef";
public Hamburg(String hamburgName) {
this.hamburgName = hamburgName;
}
public String getHamburgName() {
return hamburgName;
}
private String hamburgName;
}
public static class Drink {//飲品類
public static final String DRINK_COLA = "cola";
public static final String DRINK_SPRITE = "sprite";
public Drink(String drinkName) {
this.drinkName = drinkName;
}
private String drinkName;
public String getDrinkName() {
return drinkName;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
引入Builder類,增強客戶端可用性和可讀性【McFood的內部類】
public static class Builder {
private int totalCount = 0;
private boolean addIce = false;
private Hamburg hamburg = null;
private Drink drink = null;
private String remark = null;
private boolean takeOut = false;
public Builder totalCount(int totalCount) {
this.totalCount = totalCount;
return this;
}
public Builder addIce(boolean addIce) {
this.addIce = addIce;
return this;
}
public Builder hamburg(Hamburg hamburg) {
this.hamburg = hamburg;
return this;
}
public Builder drink(Drink drink) {
this.drink = drink;
return this;
}
public Builder remark(String remark) {
this.remark = remark;
return this;
}
public Builder takeOut(boolean takeOut) {
this.takeOut = takeOut;
return this;
}
public McFood create() { // 構建,返回一個新對象
return new McFood(this);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
當然還要設置McFood的構造方法【引入Builder】
public McFood(Builder builder) {
this.totalCount = builder.totalCount;
this.addIce = builder.addIce;
this.hamburg = builder.hamburg;
this.drink = builder.drink;
this.remark = builder.remark;
this.takeOut = builder.takeOut;
}
1
2
3
4
5
6
7
8
最后我們來看一下客戶端的操作方式
McFood food = new McFood.Builder()
.drink(new Drink(DRINK_COLA))
.addIce(false) //去冰
.hamburg(new Hamburg(HAMBURG_BEEF)) //牛肉漢堡
.takeOut(true) //外帶
.totalCount(3) //總共*3
.create();
1
2
3
4
5
6
7
看完代碼高下立判,調用傳統JAVA構造器的客戶端代碼的可讀性遠不如使用了Builder的客戶端代碼。同一類型的變量和空放置在一起被調用將會導致一些微妙的錯誤。(試想,如果客戶端不小心顛倒了其中的幾個參數順序,編譯不會出錯但在運行時肯定出錯)【如果沒用builder模式,構造方法把去冰/外帶 順序寫反了,那就GG了】
Builder模式的缺點
使用Builder模式是肯定會增加代碼量的。此外,盡管客戶端的代碼可讀性明顯改善,但隨之而來的客戶端代碼變得更加冗長。【但是前者更有價值】
Builder會增加個類代碼,這也意味著開發者在給類增加屬性時有時會忘記給該屬性添加支持的builder。為了克服這個問題,通常將builder嵌套到類中,這樣可以很容易地發現哪個相關的builder需要更新。盡管忘記的風險依舊存在,但是這風險就像忘記給類的新屬性增加 toString()、 equals(Object)、 hashCode()或其他類基于是所有屬性的方法一樣。
總結
構建對象時,如果碰到類有很多參數——其中很多參數類型相同而且很多參數可以為空時,推薦Builder模式來完成。當參數數量不多、類型不同而且都是必須出現時,通過增加代碼實現Builder往往無法體現它的優勢。在這種情況下,理想的方法是調用傳統的構造函數。再者,如果不需要保持不變,那么就使用無參構造函數調用相應的set方法吧。
總結
以上是生活随笔為你收集整理的java设计模式建造_Java设计模式——建造模式(Builder Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 调用本地接口_JAVA通过本地
- 下一篇: 仓鼠会染上瘟疫吗