Builder模式(建造者模式)是一種比較簡單的設計模式,說到Builder模式,比較容易想到的就是AlertDialog.Builder,安卓中AlertDialog是可以通過Builder生成的,但是爲什麼需要使用Builder呢?下面對Builder模式做一個簡單的介紹。
建造者模式也叫做生成器模式,其定義如下:將一個複雜對象的構建和它的表示分離,使得同樣的構建過程可以創建不同的表示。
在建造者模式中,一般有如下4個角色:
Product產品類:
通常是實現了模板方法模式,即擁有模板方法和基本方法,所謂基本方法即定義一些最基本的操作的具體實現的方法,比如AlertDialog中setTitle、setCancellable之類的方法,而模板方法可以理解爲對基本方法的一個組裝,一般在抽象類中具體實現而不需要在子類中複寫。
Builder抽象建造者:
規範產品的構建,一般由子類具體實現,這部分僅僅是接口的抽象。
Builder具體建造者:
抽象建造者的子類,實現抽象建造者中的抽象方法,並且返回一個組建好的對象。
Director導演類:
負責安排已有模塊的順序,然後告訴Builder開始建造。
建造者模式的通用源碼如下:
//產品類
public class Product(){
public void doSomething(){
//業務邏輯
}
}
//抽象建造者
public Interface IBuilder{
void setPart();
Product buildProduct();
}
//具體建造者
public class Builder implements IBuilder{
private Product product;
public void setPart(){
//業務邏輯
}
public Product buildProduct(){
return product;
}
}
//導演類
public class Director{
private IBuilder builder = new Builder();
public Product getProductA(){
builder.setPart();
return builder.buildProduct();
}
}
看過上面代碼發現使用建造者模式有什麼好處了嗎?上面的例子,通過建造者模式,使得建造過程通過Director類的量產建造順序固定的Product,即調用某一個具體建造者來批量的建造Product。
使用建造者模式,我們可以不在關注產品內部的實現細節,我們更多的關心組裝流程,即setPart內的邏輯。而且每個具體建造者是相互獨立的,這樣對系統的擴展性就非常有利,如果需要創建一個新的類型的Product,我們之間添加一個Builder類即可,此外,由於具體建造者相互獨立,所以我們可以將建造過程逐步細化,卻不會對其他模塊產生任何影響。
到這裏不知道大家有沒有這樣的疑問,建造者模式和工廠模式非常相似啊,確實是非常的相似,但是兩者還是存在一個很大的區別,建造者模式的最主要功能是基本方法的調用順序安排,也就是說這些方法已經實現了,通俗的說就是零部件的組裝,順序不同,產生的對象也不同,然而工廠方法則重點在於創建,創建零件是他的主要職責,而組裝並不是它所關心的。
下面總結下建造者模式的使用場景:
1. 相同的方法,不同的執行順序會產生不同的事件結果時,可以採用建造者模式
2. 多個部件或者零件,都可以裝配到一個對象,但是產生的運行結果卻不同時,可以採用建造者模式
3. 產品類非常複雜,或者產品類中的調用順序不同產生了不同的效果,可以採用建造者模式
想到我們一開始提到的AlertDialog就屬於產品類非常複雜,有很多屬性需要設置,這時採用建造者模式就非常適合,而Android系統中也是在AlertDialog類中嵌入一個static class Builder,通過這個Builder,我們可以鏈式的生成dialog。