Builder 建造者模式
建造者模式:
建造者模式主要是用於創建一些複雜的對象,這些對象內部構建間的建造順序是穩
定的,但是對象內部的構建通常面臨着複雜的變化。
好處就是使得建造代碼與表示代碼分離,由於建造者隱藏了改產品是
如何組裝的,所以若需要改變一個產品的內部表示,只需要再定義一個具體的建造
者就可以了。與抽象工廠的區別:
在建造者模式裏,有個指導者,由指導者來管理建造者,用戶是與指導者聯繫的,指導者聯繫建造者最後得到產品。即建造模式可以強制實行一種分步驟進行的建造過程。適用場景
- 需要生成的產品對象有複雜的內部結構,這些產品對象通常包含多個成員屬性。
- 隔離複雜對象的創建和使用,並使得相同的創建過程可以創建不同的產品。
缺點
- 建造者模式所創建的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。
- 如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。
示例類圖:
示例代碼:
// Product
public 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;
}
@Override
public String toString() {
return "Pizza [dough=" + dough + ", sauce=" + sauce + ", topping=" + topping + "]";
}
}
// Abstract Builder
public abstract class PizzaBuilder {
protected Pizza pizza;
public Pizza getPizza() {
return pizza;
}
public void createNewPizzaProduct() {
pizza = new Pizza();
}
public abstract void buildDough();
public abstract void buildSauce();
public abstract void buildTopping();
}
// ConcreteBuilder 1
public class HawaiianPizzaBuilder extends PizzaBuilder {
@Override
public void buildDough() {
pizza.setDough("cross");
}
@Override
public void buildSauce() {
pizza.setSauce("mild");
}
@Override
public void buildTopping() {
pizza.setTopping("ham+pineapple");
}
}
// ConcreteBuilder 2
public class SpicyPizzaBuilder extends PizzaBuilder {
@Override
public void buildDough() {
pizza.setDough("pan baked");
}
@Override
public void buildSauce() {
pizza.setSauce("hot");
}
@Override
public void buildTopping() {
pizza.setTopping("pepperoni+salami");
}
}
// 測試
public class BuilderTest {
public static void main(String[] args) {
Waiter waiter = new Waiter();
PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();
waiter.setPizzaBuilder(hawaiian_pizzabuilder);
waiter.constructPizza();
Pizza pizza = waiter.getPizza();
System.out.println(pizza);
waiter.setPizzaBuilder(spicy_pizzabuilder);
waiter.constructPizza();
System.out.println(waiter.getPizza());
}
}