一、引
我們在設計實現某些需求的時候,會遇到這樣的一種情況,即在實現一類組件,這類組件有固定的執行順序和固定的執行方法,只是在執行方法中的業務邏輯根據不同的需求變化。就像是生產人偶,這些人偶有兩腳、兩手、頭、身體,在生產過程中,這些部位是一定要的且生產這些部位的順序一致,只不過頭有大頭和小頭,身體有胖和瘦的區別,那麼這個時候,就可以使用建造者模式。
二、問題
以上面提到的生產人偶爲問題,應該如何實現。
三、理解(其與共產模式的區別)
我們可以將固定的邏輯操作抽象出來(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();
}
}