Java设计模式——建造者模式
构建器模式通过使用简单对象,逐步地构建复杂对象, 它是一种创建模式。
举例说明:
-
假设我们去快餐店吃饭,那里有汉堡和冷饮。
-
汉堡有可能是素食汉堡(Veg Burger)或鸡肉堡(Chicken Burger),它们都是用包装纸包装的。
-
冷饮有可能是可乐(coke)或者百事可乐(pepsi),它们都是用瓶子装的。
-
我们将创建一个表示食品(如汉堡和冷饮)信息的 Item 接口(名称、打包方式、价格),以及实现 Item 接口的具体类。
-
同时再创建一个表示打包方式(如汉堡用包装纸包装,可乐用瓶子装)的Packing接口以及Packing的具体类。
-
然后,创建一个Meal类,它包含食物的信息(Item)。
-
最后,创建一个MealBuilder类,通过组合不同的Item,生产各种Meal。
1、创建Item 接口和Packing接口
1 2 3 4 5 6 7 8 9 10 11 | // Item public interface Item { public String name(); public Packing packing(); public float price(); } // Packing public interface Packing { public String pack(); } |
2、创建Packing接口的实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // 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接口的抽象类,实现了默认的打包方式功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // 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、创建汉堡和冷饮的实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | // 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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 对象的构建器类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 来演示构建器模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗