創建型模式-建造者模式

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章