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