一. 模式結構
建造者模式主要包含四個角色:
Product:產品角色。
Builder:抽象建造者。它聲明為創建一個Product對象的各個部件指定的抽象接口。
ConcreteBuilder:具體建造者。實現抽象接口,構建和裝配各個部件。
Director:指揮者。構建一個使用Builder接口的對象。它主要是用於創建一個復雜的對象,它主要有兩個作用,一是:隔離了客戶與對象的生產過程,二是:負責控制產品對象的生產過程。
二. 模式實現
KFC里面一般都有好幾種可供客戶選擇的套餐,它可以根據客戶所點的套餐,然后在后面做這些套餐,返回給客戶的事一個完整的、美好的套餐。下面我們將會模擬這個過程,我們約定套餐主要包含漢堡、薯條、可樂、雞腿等等組成部分,使用不同的組成部分就可以構建出不同的套餐。
1. Meal.java 套餐類,Product角色
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; } }
2. MealBuilder.java 套餐構造器,Builder角色
public abstract class MealBuilder { Meal meal = new Meal(); public abstract void buildFood(); public abstract void buildDrink(); public Meal getMeal(){ return meal; } }
3. 套餐A、套餐B 實現抽象套餐類,ConcreteBuilder角色
public class MealA extends MealBuilder{ public void buildDrink() { meal.setDrink("一杯可樂"); } public void buildFood() { meal.setFood("一盒薯條"); } } public class MealB extends MealBuilder{ public void buildDrink() { meal.setDrink("一杯檸檬果汁"); } public void buildFood() { meal.setFood("三個雞翅"); } }
4. KFC的服務員 它決定了套餐是的實現過程,然后給你一個完美的套餐,Director角色
public class KFCWaiter { private MealBuilder mealBuilder; public void setMealBuilder(MealBuilder mealBuilder) { this.mealBuilder = mealBuilder; } public Meal construct(){ //准備食物 mealBuilder.buildFood(); //准備飲料 mealBuilder.buildDrink(); //准備完畢,返回一個完整的套餐給客戶 return mealBuilder.getMeal(); } }
三. 測試
public class Client { public static void main(String[] args) { //服務員 KFCWaiter waiter = new KFCWaiter(); //套餐A MealA a = new MealA(); //服務員准備套餐A waiter.setMealBuilder(a); //獲得套餐 Meal mealA = waiter.construct(); System.out.print("套餐A的組成部分:"); System.out.println(mealA.getFood()+"---"+mealA.getDrink()); } }
運行結果:套餐A的組成部分:一盒薯條---一杯可樂
四. 模式總結
1. 建造者模式是將一個復雜對象的創建過程給封裝起來,客戶只需要知道可以利用對象名或者類型就能夠得到一個完整的對象實例,而不需要關心對象的具體創建過程。
2. 建造者模式將對象的創建過程與對象本身隔離開了,使得細節依賴於抽象,符合依賴倒置原則。可以使用相同的創建過程來創建不同的產品對象。
