建造模式将多个简单对象一步步构造成一个复杂对象。
例如快餐店的套餐,有双层吉士堡套餐(双层吉士堡+可口可乐),麦辣鸡腿堡套餐(麦辣鸡腿堡+百事可乐)。
这些套餐都是由汉堡+饮料组合(也可以看做是构建)起来的。
定义了这些简单对象(具体的汉堡和饮料),后续就可以将其组合构建成多个套餐。
Item接口中有获取商品的包装,名称,价格的方法。
定义包装接口Packing,包装纸(Wrapper)和瓶子(Bottle)实现了Packing接口
抽象类Burger、ColdDrink实现了Item接口中的pack,返回类型为Packing.
具体的VegBurger继承Burger接口,由于抽象类Burger实现了接口的pack方法,
所以VegBurger继承Burger时只需要实现price和name方法。
Meal中定义了一个Item类型的集合,用于存放商品(汉堡、冷饮)。
还定义了设置商品,计算商品价格、展示商品的方法。
MealBuild用于建造商品套餐(Meal),例如蔬菜汉堡+可乐 = 素食套装。
定义Item(商品接口),商品(汉堡,可乐等)需包含名称,价格,包装(汉堡用纸包,可乐使用瓶子)。
public interface Item { public String name(); public Packing packing(); public float price(); }
定义包装接口
public interface Packing { public String pack(); }
汉堡实现商品接口,由于汉堡是抽象了,所以可以不实现Item接口所有方法。
public abstract class Burger implements Item{ @Override public Packing packing() { // TODO Auto-generated method stub return new Wrapper(); } }
冷饮继承了Item接口
public abstract class ColdDrink implements Item{ @Override public Packing packing() { // TODO Auto-generated method stub return new Bottle(); } }
包装纸实现了Packing(包装)接口
public class Wrapper implements Packing{ @Override public String pack() { return "Wrapper"; } }
Bottle(瓶子)实现了Packing接口
public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } }
VegBurger(蔬菜汉堡) 继承自汉堡,Burger是抽象类并且实现了Item接口中的pack方法,故VegBurger继承Burger后,只需重写Item接口中Burger没有实现的方法即可。
故只需实现name(),price().
public class VegBurger extends Burger{ @Override public String name() { // TODO Auto-generated method stub return "VegBurger"; } @Override public float price() { // TODO Auto-generated method stub return 20.0f; } }
Coke继承冷饮,也只用实现Item接口中ColdDrink没有实现的方法。
public class Coke extends ColdDrink{ @Override public String name() { // TODO Auto-generated method stub return "Coke"; } @Override public float price() { // TODO Auto-generated method stub return 5.0f; } }
Meal对象类包含多个Item.
import java.util.ArrayList; import java.util.List; public class Meal { private List<Item> items = new ArrayList<Item>(); public void addItem(Item item) { items.add(item); } public float getCost() { //计算总价 float cost = 0.0f; for(Item item:items) { cost += item.price(); } return cost; } public void showItem() { //展示套餐内容 for(Item item:items) { System.out.println("name:"+item.name()); System.out.println("price:"+item.price()); System.out.println("packing:"+item.packing().pack()); } System.out.println("--:" + getCost()); } }
MealBuilder构建Meal,可以根据具体需求构建不同Meal。
public class MealBuilder { public Meal createVagMeal() {//创建蔬菜汉堡套餐,也可根据需要创建其他汉堡套餐,添加一个create方法即可。 Meal vagMeal = new Meal(); vagMeal.addItem(new VegBurger()); vagMeal.addItem(new Coke()); return vagMeal; } }
测试:
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub MealBuilder mealBuilder = new MealBuilder(); Meal veg = mealBuilder.createVagMeal(); veg.showItem(); } }
参考资料: