一. 模式结构
建造者模式主要包含四个角色:
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. 建造者模式将对象的创建过程与对象本身隔离开了,使得细节依赖于抽象,符合依赖倒置原则。可以使用相同的创建过程来创建不同的产品对象。