一. 模式结构
建造者模式主要包含四个角色:
Product:产品角色。
Builder:抽象建造者。它声明为创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder:具体建造者。实现抽象接口,构建和装配各个部件。
Director:指挥者。构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
二. 模式实现
KFC里面一般都有好几种可供客户选择的套餐,它可以根据客户所点的套餐,然后在后面做这些套餐,返回给客户的事一个完整的、美好的套餐。下面我们将会模拟这个过程,我们约定套餐主要包含汉堡、薯条、可乐、鸡腿等等组成部分,使用不同的组成部分就可以构建出不同的套餐。
1. Meal.java 套餐类,Product角色
public classMeal {privateString food;privateString drink;publicString getFood() {returnfood;
}public voidsetFood(String food) {this.food =food;
}publicString getDrink() {returndrink;
}public voidsetDrink(String drink) {this.drink =drink;
}
}
View Code
2. MealBuilder.java 套餐构造器,Builder角色
public abstract classMealBuilder {
Meal meal= newMeal();public abstract voidbuildFood();public abstract voidbuildDrink();publicMeal getMeal(){returnmeal;
}
}
View Code
3. 套餐A、套餐B 实现抽象套餐类,ConcreteBuilder角色
public class MealA extendsMealBuilder{public voidbuildDrink() {
meal.setDrink("一杯可乐");
}public voidbuildFood() {
meal.setFood("一盒薯条");
}
}public class MealB extendsMealBuilder{public voidbuildDrink() {
meal.setDrink("一杯柠檬果汁");
}public voidbuildFood() {
meal.setFood("三个鸡翅");
}
}
View Code
4. KFC的服务员 它决定了套餐是的实现过程,然后给你一个完美的套餐,Director角色
public classKFCWaiter {privateMealBuilder mealBuilder;public voidsetMealBuilder(MealBuilder mealBuilder) {this.mealBuilder =mealBuilder;
}publicMeal construct(){//准备食物
mealBuilder.buildFood();//准备饮料
mealBuilder.buildDrink();//准备完毕,返回一个完整的套餐给客户
returnmealBuilder.getMeal();
}
}
View Code
三. 测试
public classClient {public static voidmain(String[] args) {//服务员
KFCWaiter waiter = newKFCWaiter();//套餐A
MealA a = newMealA();//服务员准备套餐A
waiter.setMealBuilder(a);//获得套餐
Meal mealA =waiter.construct();
System.out.print("套餐A的组成部分:");
System.out.println(mealA.getFood()+"---"+mealA.getDrink());
}
}
View Code
运行结果:套餐A的组成部分:一盒薯条---一杯可乐
四. 模式总结
1. 建造者模式是将一个复杂对象的创建过程给封装起来,客户只需要知道可以利用对象名或者类型就能够得到一个完整的对象实例,而不需要关心对象的具体创建过程。
2. 建造者模式将对象的创建过程与对象本身隔离开了,使得细节依赖于抽象,符合依赖倒置原则。可以使用相同的创建过程来创建不同的产品对象。