创建型模式-建造者模式

1.建造者模式

    使用简单的对象构造复杂的对象。

2.举例:

我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。

我们将创建一个表示食物条目(比如汉堡和冷饮)的Food 接口和实现 Food 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilderBuilderPatternDemo,我们的演示类使用 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

猜你喜欢

转载自blog.csdn.net/dxh0823/article/details/80105293
今日推荐