1.建造者模式
使用简单的对象构造复杂的对象。
2.举例:
我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。
我们将创建一个表示食物条目(比如汉堡和冷饮)的Food 接口和实现 Food 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。
然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder。BuilderPatternDemo,我们的演示类使用 MealBuilder 来创建一个 Meal。
3.UML
4.代码实现
public interface Food {
/**
* 食物的名称
* @return
*/
String name();
/**
* 食物的包装方式
* @return
*/
Packing packing();
/**
* 食物的价格
* @return
*/
BigDecimal price();
}
public interface Packing {
String pack();
}
public class Bottle implements Packing{
@Override
public String pack() {
return "Bottle";
}
}
public class Wrapper implements Packing{
@Override
public String pack() {
return "Wrapper";
}
}
public abstract class Burger implements Food{
@Override
public Packing packing() {
return new Wrapper();
}
}
public abstract class ColdDrink implements Food{
@Override
public Packing packing(){
return new Bottle();
}
}
public class ChickenBurger extends Burger{
@Override
public String name() {
return "Chicken Burger";
}
@Override
public BigDecimal price() {
return BigDecimal.valueOf(50.5);
}
}
public class VegBurger extends Burger{
@Override
public String name() {
return "Veg Burger";
}
@Override
public BigDecimal price() {
return BigDecimal.valueOf(25.0);
}
}
public class CocaCola extends ColdDrink{
@Override
public String name() {
return "CocaCola";
}
@Override
public BigDecimal price() {
return BigDecimal.valueOf(30.0);
}
}
public class PepsiCola extends ColdDrink{
@Override
public String name() {
return "PepsiCola";
}
@Override
public BigDecimal price() {
return BigDecimal.valueOf(35.0);
}
}
public class Meal {
private List<Food> items = new ArrayList<>();
public void addItem(Food item) {
items.add(item);
}
public BigDecimal getCost() {
BigDecimal cost = BigDecimal.ZERO;
for (Food item : items) {
cost = cost.add(item.price());
}
return cost;
}
public void showItems() {
for (Food item : items) {
System.out.print("Item : " + item.name());
System.out.print(", Packing : " + item.packing().pack());
System.out.println(", Price : " + item.price());
}
}
}
public class MealBuilder {
public static Meal prepareVegMeal() {
Meal meal = new Meal();
meal.addItem(new VegBurger());
meal.addItem(new CocaCola());
return meal;
}
public static Meal prepareNonVegMeal() {
Meal meal = new Meal();
meal.addItem(new ChickenBurger());
meal.addItem(new PepsiCola());
return meal;
}
}
5 测试类
public class MealBuilderTest {
@Test
public void test() {
Meal nonvegmeal = MealBuilder.prepareNonVegMeal();
System.out.println("Non-Veg Meal");
nonvegmeal.showItems();
System.out.println("Total Cost: " + nonvegmeal.getCost());
Meal vegMeal = MealBuilder.prepareVegMeal();
System.out.println("\n\nVeg Meal");
vegMeal.showItems();
System.out.println("Total Cost: " + vegMeal.getCost());
}
}
测试结果:
Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : PepsiCola, Packing : Bottle, Price : 35.0
Total Cost: 85.5
Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : CocaCola, Packing : Bottle, Price : 30.0
Total Cost: 55.0