設計模式:建造者模式及其與工廠模式的區別

一、引

我們在設計實現某些需求的時候,會遇到這樣的一種情況,即在實現一類組件,這類組件有固定的執行順序和固定的執行方法,只是在執行方法中的業務邏輯根據不同的需求變化。就像是生產人偶,這些人偶有兩腳、兩手、頭、身體,在生產過程中,這些部位是一定要的且生產這些部位的順序一致,只不過頭有大頭和小頭,身體有胖和瘦的區別,那麼這個時候,就可以使用建造者模式。

二、問題

以上面提到的生產人偶爲問題,應該如何實現。

三、理解(其與共產模式的區別)

我們可以將固定的邏輯操作抽象出來(Builder),然後在不同形狀的人偶實現不同的具體類(ConcreteBuilder),併爲了保證依賴倒置原則,再加一個指揮生產的類,是建造過程對客戶端封閉。可能這個時候就有人會問,那這不就像是工廠模式麼,抽象不同的的操作,使用工廠類生產。但是,我們要注意到,工廠模式其實就是封裝了new的“調用動作(new XXX)”,使客戶端不用按服務端的規定顯式的指定new什麼,而是通過更高抽象的create函數並導入客戶端的規定來new出服務端的東西。建造者模式則是封裝了new的“實現定義(以組合的角度來確定其結構)”,使客戶端不用去接觸new裏複雜的組合步驟。

話句話說,當一類產品中不同實例對象的建造過程相似,且未來很有可能要修改建造順序的話,那建造者模式可以處理這種情況。從 普通的工廠方法模式 到 結合建造者模式的工廠方法模式,對產品用戶(Store類)沒有影響。所以對於產品用戶來說,是否用建造者模式是不知情的,因爲產品用戶只關心產品的獲取。所以正如開頭所說,工廠模式用於處理 如何獲取實例對象 問題,建造者模式用於處理 如何建造實例對象問題。以下是建造者模式的機構圖:

四、實現

abstract class Builder {
	public abstract void BuildPartA();
	public abstract void BuildPartB();
	public abstract Product GetResult();
}
public class Director {
	public void Construct(Builder builder) {
		builder.BuildPartA();
		builder.BuildPartB();
	}
}
public class Product {
	List<String> parts = new ArrayList<String>();
	
	public void Add(String part) {
		parts.add(part);
	}
	
	public void Show() {
		for (String string : parts) {
			//具體操作
		}
	}
}
public class ConcreteBuiler1 extends Builder {
	private Product product = new Product();

	@Override
	public void BuildPartA() {
		// 具體操作

	}

	@Override
	public void BuildPartB() {
		// 具體操作

	}

	@Override
	public Product GetResult() {
		return product;
	}

}

public class ConcreteBuiler2 extends Builder {
	private Product product = new Product();

	@Override
	public void BuildPartA() {
		// 具體操作

	}

	@Override
	public void BuildPartB() {
		// 具體操作

	}

	@Override
	public Product GetResult() {
		return product;
	}

}
public class Main {

	public static void main(String[] args) {
		Director director = new Director();
		Builder builder1 = new ConcreteBuiler1();
		Builder builder2 = new ConcreteBuiler2();
		
		director.Construct(builder1);
		Product product1 = builder1.GetResult();
		product1.Show();
		
		director.Construct(builder2);
		Product product = builder2.GetResult();
		product.Show();
	}

}

 

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