Java設計模式——建造者模式
阿新 • • 發佈:2022-04-07
構建器模式通過使用簡單物件,逐步地構建複雜物件, 它是一種建立模式。
舉例說明:
-
假設我們去快餐店吃飯,那裡有漢堡和冷飲。
-
漢堡有可能是素食漢堡(Veg Burger)或雞肉堡(Chicken Burger),它們都是用包裝紙包裝的。
-
冷飲有可能是可樂(coke)或者百事可樂(pepsi),它們都是用瓶子裝的。
-
我們將建立一個表示食品(如漢堡和冷飲)資訊的 Item 介面(名稱、打包方式、價格),以及實現 Item 介面的具體類。
-
同時再建立一個表示打包方式(如漢堡用包裝紙包裝,可樂用瓶子裝)的Packing介面以及Packing的具體類。
-
然後,建立一個Meal類,它包含食物的資訊(Item)。
-
最後,建立一個MealBuilder類,用來生產各種Meal。
1、建立Item 介面和Packing介面
// Item public interface Item { public String name(); public Packing packing(); public float price(); } // Packing public interface Packing { public String pack(); }
2、建立Packing介面的實現類
// Wrapper public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } } // Bottle public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } }
3、建立Item介面的抽象類,實現了預設的打包方式功能
// Burger public abstract class Burger implements Item { @Override public Packing packing() { return new Wrapper(); } @Override public abstract float price(); } // ColdDrink public abstract class ColdDrink implements Item { @Override public Packing packing() { return new Bottle(); } @Override public abstract float price(); }
4、建立漢堡和冷飲的實現類
// VegBurger public class VegBurger extends Burger { @Override public float price() { return 25.0f; } @Override public String name() { return "Veg Burger"; } } // ChickenBurger public class ChickenBurger extends Burger { @Override public float price() { return 50.5f; } @Override public String name() { return "Chicken Burger"; } } // Coke public class Coke extends ColdDrink { @Override public float price() { return 30.0f; } @Override public String name() { return "Coke"; } } // Pepsi public class Pepsi extends ColdDrink { @Override public float price() { return 35.0f; } @Override public String name() { return "Pepsi"; } }
5、建立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 showItems(){ for (Item item : items) { System.out.print("Item : " + item.name()); System.out.print(", Packing : " + item.packing().pack()); System.out.println(", Price : " + item.price()); } } }
6、建立 MealBuilder 類,負責建立 Meal 物件的構建器類
public class MealBuilder { public Meal prepareVegMeal (){ Meal meal = new Meal(); meal.addItem(new VegBurger()); meal.addItem(new Coke()); return meal; } public Meal prepareNonVegMeal (){ Meal meal = new Meal(); meal.addItem(new ChickenBurger()); meal.addItem(new Pepsi()); return meal; } }
7、測試,BuiderPatternDemo 使用 MealBuider 來演示構建器模式
public class BuilderPatternDemo { public static void main(String[] args) { MealBuilder mealBuilder = new MealBuilder(); Meal vegMeal = mealBuilder.prepareVegMeal(); System.out.println("Veg Meal"); vegMeal.showItems(); System.out.println("Total Cost: " + vegMeal.getCost()); Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); System.out.println("\n\nNon-Veg Meal"); nonVegMeal.showItems(); System.out.println("Total Cost: " + nonVegMeal.getCost()); } }
8、測試結果
Veg Meal Item : Veg Burger, Packing : Wrapper, Price : 25.0 Item : Coke, Packing : Bottle, Price : 30.0 Total Cost: 55.0 Non-Veg Meal Item : Chicken Burger, Packing : Wrapper, Price : 50.5 Item : Pepsi, Packing : Bottle, Price : 35.0 Total Cost: 85.5