Java实战:用建造者模式打造KFC不同套餐
建造者模式是一种设计模式,用于将一个复杂的对象构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式非常适合于对象的创建步骤较多且复杂的情况,比如KFC的套餐构建。 下面通过一个简单的例子来展示如何使用建造者模式来构建KFC的套餐。 1. 定义产品类(套餐) 首先,定义一个`Meal`类,这个类代表一个套餐,其中包含多个组成部分,如主食和饮料。 ```java public class Meal { private List<Item> items = new ArrayList<>(); 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()); } } } ``` 2. 定义抽象构建者 接下来,定义一个抽象的`MealBuilder`类,它声明了构建套餐所需的各个方法。 ```java public abstract class MealBuilder { protected Meal meal; public MealBuilder() { this.meal = new Meal(); } public abstract void buildBurger(); public abstract void buildDrink(); public abstract void buildSnack(); public Meal getMeal() { return meal; } } ``` 3. 实现具体构建者 为不同的套餐实现具体的构建者。例如,为儿童套餐和成人套餐分别创建两个具体的构建者。 儿童套餐构建者 ```java public class KidsMealBuilder extends MealBuilder { @Override public void buildBurger() { meal.addItem(new ChickenBurger()); } @Override public void buildDrink() { meal.addItem(new Coke()); } @Override public void buildSnack() { meal.addItem(new FrenchFries()); } } ``` 成人套餐构建者 ```java public class AdultMealBuilder extends MealBuilder { @Override public void buildBurger() { meal.addItem(new VegBurger()); } @Override public void buildDrink() { meal.addItem(new Pepsi()); } @Override public void buildSnack() { meal.addItem(new OnionRings()); } } ``` 4. 定义导演类 导演类负责调用构建者的各个方法来构建具体的套餐。 ```java public class Waiter { private MealBuilder mealBuilder; public void setMealBuilder(MealBuilder mb) { this.mealBuilder = mb; } public Meal getMeal() { return mealBuilder.getMeal(); } public void constructMeal() { mealBuilder.buildBurger(); mealBuilder.buildDrink(); mealBuilder.buildSnack(); } } ``` 5. 定义产品部件 定义具体的食品和饮料类,这些是套餐的组成部分。 ```java public interface Item { String name(); Packing packing(); float price(); } public interface Packing { String pack(); } public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } } public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } } public class VegBurger implements Item { @Override public String name() { return "Veg Burger"; } @Override public Packing packing() { return new Wrapper(); } @Override public float price() { return 50.0f; } } public class ChickenBurger implements Item { @Override public String name() { return "Chicken Burger"; } @Override public Packing packing() { return new Wrapper(); } @Override public float price() { return 60.0f; } } public class Coke implements Item { @Override public String name() { return "Coke"; } @Override public Packing packing() { return new Bottle(); } @Override public float price() { return 30.0f; } } public class Pepsi implements Item { @Override public String name() { return "Pepsi"; } @Override public Packing packing() { return new Bottle(); } @Override public float price() { return 35.0f; } } public class FrenchFries implements Item { @Override public String name() { return "French Fries"; } @Override public Packing packing() { return new Wrapper(); } @Override public float price() { return 20.0f; } } public class OnionRings implements Item { @Override public String name() { return "Onion Rings"; } @Override public Packing packing() { return new Wrapper(); } @Override public float price() { return 25.0f; } } ``` 6. 使用示例 我们可以通过以下代码来演示如何使用上述类来构建不同类型的套餐。 ```java public class KFCMealBuilderDemo { public static void main(String[] args) { Waiter waiter = new Waiter(); MealBuilder kidsMealBuilder = new KidsMealBuilder(); waiter.setMealBuilder(kidsMealBuilder); waiter.constructMeal(); Meal kidsMeal = waiter.getMeal(); kidsMeal.showItems(); System.out.println("Total Cost: " + kidsMeal.getCost()); MealBuilder adultMealBuilder = new AdultMealBuilder(); waiter.setMealBuilder(adultMealBuilder); waiter.constructMeal(); Meal adultMeal = waiter.getMeal(); adultMeal.showItems(); System.out.println("Total Cost: " + adultMeal.getCost()); } } ``` 这段代码展示了如何使用建造者模式来构建不同类型的KFC套餐,并打印出每个套餐的详细信息及其总价格。 ######[AI写代码神器 | 1350点数解答 | 2024-10-24 16:59:34]
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)436
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)333
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1226
- 抽象工厂模式:实现 KFC 与 Mdl 快餐产品代工厂的 Java 代码解析(阿里通义 | 863点数解答 | 2024-10-24 17:32:40)315
- Python 代码助力西餐厅“美味两件套”套餐名称生成(字节豆包 | 134点数解答 | 2025-11-02 20:50:10)87
- 深入解析格雷码生成算法:递归求解与代码实现(DeepSeek | 443点数解答 | 2026-01-05 12:21:49)73
- 深入探究:n 位格雷码中编号 k 二进制串的求解算法与实现(DeepSeek | 726点数解答 | 2026-01-13 12:31:37)73
- "Java Code: Uncovering Stock Statistics through CSV File Reading"(字节豆包 | 66点数解答 | 2024-11-13 15:31:04)345
- 深度解析:Vue中MVVM模式的组成、原理与双向数据绑定优势 (阿里通义 | 249点数解答 | 2023-11-09 00:56:24)276
- Android开发:Kotlin实现Builder模式示例及优势解析(百度文心 | 456点数解答 | 2023-11-09 17:29:15)259
- 工程师必知:PO模式与Page Factory的深度解析(百度文心 | 132点数解答 | 2023-11-09 18:33:18)293
- 2026 年苍溪县印刷企业年报工作:现状、问题与未来举措(字节豆包 | 1245点数解答 | 2026-03-09 12:55:05)27