Builder Pattern

使用時機

你所要產生的物件是一個較為複雜的產品物件,這個產品物件需要經由若干個較小的零件(組件)物件所組合而成。換句話說,產生這個產品物件的過程需要經過好幾個步驟才能夠完成(不是直接把所要產生的物件給 new 出來就好了)。

  • 組合出這個複雜產品物件的步驟是固定的,但是產生各種不同零件物件的實作卻可以有很多種不同的方式。
  • 在設計階段你知道組裝產品物件的步驟以及個別組件物件的介面,但是不知道產生這些零件物件的具體類別。

from: Creational Patterns要解決什麼問題(下)?

from: Builder Pattern Tutorial with Java Examples

Example

Product

class Pizza {
    private String dough = "";
    private String sauce = "";
    private String topping = "";

    public void setDough(String dough) {
        this.dough = dough;
    }

    public void setSauce(String sauce) {
        this.sauce = sauce;
    }

    public void setTopping(String topping) {
        this.topping = topping;
    }
}

Builder interface

public interface PizzaBuilder {
    public void setDough();
    public void setSauce();
    public void setTopping();

    public Pizza buildPizza();
}

Implement builders for different products

class HawaiianPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    public void setDough() {
        pizza.setDough("cross");
    }

    public void setSauce() {
        pizza.setSauce("mild");
    }

    public void setTopping() {
        pizza.setTopping("ham+pineapple");
    }

    public Pizza buildPizza() {
        return pizza;
    }

}
class SpicyPizzaBuilder implements PizzaBuilder {
    private Pizza pizza = new Pizza();

    public void setDough() {
        pizza.setDough("pan baked");
    }

    public void setSauce() {
        pizza.setSauce("hot");
    }

    public void setTopping() {
        pizza.setTopping("pepperoni+salami");
    }

    public Pizza buildPizza() {
        return pizza;
    }

}

Director

class Waiter {
    private PizzaBuilder pizzaBuilder;

    public Waiter(PizzaBuilder pb) {
        pizzaBuilder = pb;
    }

    public Pizza constructPizza() {
        pizzaBuilder.setDough();
        pizzaBuilder.setSauce();
        pizzaBuilder.setTopping();
        pizzaBuilder.buildPizza();
    }
}

Usage

public class PizzaBuilderDemo {
    public static void main(String[] args) {
        Waiter waiter = new Waiter(new HawaiianPizzaBuilder())
        Pizza pizza = waiter.constructPizza();
    }
}

from: Builder in Java