一. 模式結構java
建造者模式主要包含四個角色: ide
Product:產品角色。
Builder:抽象建造者。它聲明爲建立一個Product對象的各個部件指定的抽象接口。
ConcreteBuilder:具體建造者。實現抽象接口,構建和裝配各個部件。
Director:指揮者。構建一個使用Builder接口的對象。它主要是用於建立一個複雜的對象,它主要有兩個做用,一是:隔離了客戶與對象的生產過程,二是:負責控制產品對象的生產過程。
二. 模式實現測試
KFC裏面通常都有好幾種可供客戶選擇的套餐,它能夠根據客戶所點的套餐,而後在後面作這些套餐,返回給客戶的事一個完整的、美好的套餐。下面咱們將會模擬這個過程,咱們約定套餐主要包含漢堡、薯條、可樂、雞腿等等組成部分,使用不一樣的組成部分就能夠構建出不一樣的套餐。
1. Meal.java 套餐類,Product角色ui
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角色this
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角色spa
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角色3d
public class KFCWaiter { private MealBuilder mealBuilder; public void setMealBuilder(MealBuilder mealBuilder) { this.mealBuilder = mealBuilder; } public Meal construct(){ //準備食物 mealBuilder.buildFood(); //準備飲料 mealBuilder.buildDrink(); //準備完畢,返回一個完整的套餐給客戶 return mealBuilder.getMeal(); } }
三. 測試 code
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的組成部分:一盒薯條---一杯可樂對象
四. 模式總結
blog
1. 建造者模式是將一個複雜對象的建立過程給封裝起來,客戶只須要知道能夠利用對象名或者類型就可以獲得一個完整的對象實例,而不須要關心對象的具體建立過程。
2. 建造者模式將對象的建立過程與對象自己隔離開了,使得細節依賴於抽象,符合依賴倒置原則。能夠使用相同的建立過程來建立不一樣的產品對象。