標簽(空格分隔): android 設計模式 builder
1 Builder設計模式概述
將復雜對象的構建與它的表示分離碌识,使得同樣的構建過程可以產生不容的表示澈魄。即通過一個專門的Builder的對象來構建新的對象理疙。
2 使用場景
- 一般用于復雜對象的構建齿梁。
例如油额,網絡訪問的對象需要傳入多個參數叠纷,將參數類型設置為一個Config類,構建Config類的對象就可以使用Builder類潦嘶。
3 三種構建對象方式的比較
3.1 通過構造函數傳入
壞處:參數多的時候涩嚣,編寫代碼的人要當心傳錯參數,查看代碼的人不太容易理解傳入參數的含義掂僵。不方便維護航厚。即使是分多個構造函數傳入不同的參數也是一樣。
3.2 通過setter挨個構造
好處:易于閱讀锰蓬,并且可以只對有用的成員變量賦值幔睬;
缺點:
不能使用final類型
用戶可能拿到不完整的對象。
3.3 Builder方式構造
- 1內容:
在要構建的類的內部創(chuàng)建一個靜態(tài)內部Builder類
該靜態(tài)內部類的字段與要創(chuàng)建的類保持一致
Builder類的構造方法傳入初始化必須的參數(final類型)
Builder類提供setter方法芹扭,返回自身this
要構建的類的構造方法傳入Builder類的實例
Builder類提供build方法麻顶,調用要構建的類的構造方法,返回要構建的類的實例。
- 2核心思想:
變種 Builder 模式目的在于減少對象創(chuàng)建過程中引入的多個構造函數舱卡、可選參數以及多個 setter 過度使用導致的不必要的復雜性辅肾。同時某些參數如果用戶沒有設置,可以有默認值轮锥。
- 3好處:
鏈式調用宛瞄,優(yōu)雅好看
先賦值,后創(chuàng)建對象,保證對象的完整性份汗。
- 4代碼:
public class Person {
//固定不變的對象盈电,一般變量需要聲明為 final
private final String mName; //必選,final 類型需要在 構造器中初始化杯活,不允許不初始化它的構造器存在
private String mLocation; //可選
private String mJob; //可選
private String mHabit; //可選
/**
* 構造方法的參數是它的 靜態(tài)內部類匆帚,使用靜態(tài)內部類的變量一一賦值
* @param builder
*/
public Person(Builder builder) {
this.mName = builder.mName;
this.mLocation = builder.mLocation;
this.mJob = builder.mJob;
this.mHabit = builder.mHabit;
}
/**
* Person 的靜態(tài)內部類,成員變量和 Person 的一致
*/
public static class Builder{
private final String mName; //必選旁钧,final 類型需要在 構造器中初始化吸重,不允許不初始化它的構造器存在
private String mLocation; //可選
private String mJob; //可選
private String mHabit; //可選
/**
* 含必選參數的構造方法
* @param name
*/
public Builder(String name) {
mName = name;
}
public Builder setLocation(String location) {
mLocation = location;
return this;
}
public Builder setJob(String job) {
mJob = job;
return this;
}
public Builder setHabit(String habit) {
mHabit = habit;
return this;
}
/**
* 最終構建方法,返回一個 PersonTree 對象歪今,參數是當前 Builder 對象
* @return
*/
public PersonThree build(){
return new Person(this);
}
}
}
- 5技巧:
下載AS插件 Inner Builder,寫好要構建的類的字段之后嚎幸,直接 Generate構造Buidler
4 實際案例
android中的AlertDialog對象就是使用Builder模式來構建的。
new AlertDialog.Builder(self)
.setTitle("標題")
.setMessage("簡單消息框")
.setPositiveButton("確定", null)
.show();