設計模式之Builder模式

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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章