5.Builder-建造者模式

Builder 建造者模式

  • 建造者模式:
    建造者模式主要是用於創建一些複雜的對象,這些對象內部構建間的建造順序是穩
    定的,但是對象內部的構建通常面臨着複雜的變化。
    好處就是使得建造代碼與表示代碼分離,由於建造者隱藏了改產品是
    如何組裝的,所以若需要改變一個產品的內部表示,只需要再定義一個具體的建造
    者就可以了。

  • 與抽象工廠的區別:
    在建造者模式裏,有個指導者,由指導者來管理建造者,用戶是與指導者聯繫的,指導者聯繫建造者最後得到產品。即建造模式可以強制實行一種分步驟進行的建造過程。

  • 適用場景

    1. 需要生成的產品對象有複雜的內部結構,這些產品對象通常包含多個成員屬性。
    2. 隔離複雜對象的創建和使用,並使得相同的創建過程可以創建不同的產品。
  • 缺點

    1. 建造者模式所創建的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。
    2. 如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。

示例類圖:
Builder_uml
Builder2_uml

示例代碼:

// 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());
    }
}
發佈了38 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章