JAVA設計模式之建造者模式

勿在浮沙築高臺LS發表於2016-12-01

1.模式的定義
建造者模式構建複雜物件就像造汽車一樣,是一個一個元件一個一個步驟建立出來的,它允許使用者通過制定的物件型別和內容來建立他們,但是使用者並不需要知道這個複雜物件是如何構建的,它只需要明白通過這樣做我可以得到一個完整的複雜物件例項。
2.模式結構
建造者模式主要包含四個角色:
Builder:抽象建造者。它宣告為建立一個Product物件的各個部件指定的抽象介面。
ConcreteBuilder:具體建造者。實現抽象介面,構建和裝配各個部件。
Director:指揮者。構建一個使用Builder介面的物件。它主要是用於建立一個複雜的物件,它主要有兩個作用,一是:隔離了客戶與物件的生產過程,二是:負責控制產品物件的生產過程。
Product:產品角色。一個具體的產品物件。
3.模式實現
KFC裡面一般都有好幾種可供客戶選擇的套餐,它可以根據客戶所點的套餐,然後在後面做這些套餐,返回給客戶的事一個完整的、美好的套餐。下面我們將會模擬這個過程,我們約定套餐主要包含漢堡、薯條、可樂、雞腿等等組成部分,使用不同的組成部分就可以構建出不同的套餐。
實驗程式碼:

package Builder;

public class Meal {
    private String food;
    private String drink;

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    public String getDrink() {
        return drink;
    }

    public void setDrink(String drink) {
        this.drink = drink;
    }
}

套餐構造器:MealBuilder.java

package Builder;

public abstract class MealBuilder {
    Meal meal = new Meal();

    public abstract void buildFood();

    public abstract void buildDrink();

    public Meal getMeal(){
        return meal;
    }
}

然後是套餐A、套餐B。這個兩個套餐都是實現抽象套餐類。

package Builder;

public class MealA extends MealBuilder{

    public void buildDrink() {
        meal.setDrink("一杯可樂");
    }

    public void buildFood() {
        meal.setFood("一盒薯條");
    }

}
package Builder;


public class MealB extends MealBuilder{

    public void buildDrink() {
        meal.setDrink("一杯檸檬果汁");
    }

    public void buildFood() {
        meal.setFood("三個雞翅");
    }

}

最後是KFC的服務員,它相當於一個指揮者,它決定了套餐是的實現過程,然後給你一個完美的套餐

package Builder;

public class KFCWaiter {
    private MealBuilder mealBuilder;

    public void setMealBuilder(MealBuilder mealBuilder) {
        this.mealBuilder = mealBuilder;
    }

    public Meal construct(){
        //準備食物
        mealBuilder.buildFood();
        //準備飲料
        mealBuilder.buildDrink();

        //準備完畢,返回一個完整的套餐給客戶
        return mealBuilder.getMeal();
    }
}

測試類

package Builder;

public class Client {
    public static void main(String[] args) {
        //服務員
        KFCWaiter waiter = new KFCWaiter();
        //套餐A
        MealB a = new MealB();
        //服務員準備套餐A
        waiter.setMealBuilder(a);
        //獲得套餐
        Meal mealA = waiter.construct();

        System.out.print("套餐B的組成部分:");
        System.out.println(mealA.getFood()+"---"+mealA.getDrink());
    }
}

我們可以使用工廠模式建造更多的套餐,然後使用建造者模式讓人們選擇不同的套餐。

相關文章