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