设计模式之生成实例_Builder模式_组装复杂的实例
前言
博主github
博主个人博客http://blog.healerjean.com
1、业务场景
**使用多个简单的对象一步一步构建成一个复杂的对象, **
比如:肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,我们可以定义一个组装Meal类,和一个建造者类Builder调用这个组装类来制作一个复杂的对象
1.1、外观模式和建造者模式的区别
1.1.1、Builder的目的是希望用同样的生产过程,根据不同的生产者得到不同的产品。
1.1.12、而外观模式则是将多个对象组合起来,它不需要生产者,也不需要得到不同的结果。
2、实例代码:食物打包
2.1、食物属性Item
接口
/**
* @author HealerJean
* @version 1.0v
* @ClassName Item
* @date 2019/8/6 12:54.
* @Description 商品属性
*/
public interface Item {
/** 商品名称 */
String name();
/** 商品价格 */
float price();
/** 打包方式 */
Pack packing();
}
2.2、有些类似的食物具有相同的打包方式,所以讲它抽象出来,做成父类
2.21、定义打包方式接口 Pack
接口
/**
* @author HealerJean
* @version 1.0v
* @ClassName Pack
* @date 2019/8/6 12:54.
* @Description 打包方式
*/
public interface Pack {
String pack();
}
2.2.21、汉堡打包方式为塑料袋
public class PackWrapper implements Pack {
@Override
public String pack() {
return "塑料袋";
}
}
2.2.2.2、饮料打包方式为瓶装
public class PackBottle implements Pack {
@Override
public String pack() {
return "瓶装";
}
}
2.2.2、鸡腿汉堡、定义属性和价格
public class BurgerChicken extends Burger {
@Override
public float price() {
return 50.5f;
}
@Override
public String name() {
return "鸡腿汉堡";
}
}
2.2.3、蔬菜汉堡、定义属性和价格
public class BurgerVeg extends Burger {
@Override
public float price() {
return 25.0f;
}
@Override
public String name() {
return "蔬菜汉堡";
}
}
2.2.4、可口可乐饮料、定义属性和价格
public class ColdDrinkCoke extends ColdDrink {
@Override
public float price() {
return 30.0f;
}
@Override
public String name() {
return "可口可乐";
}
}
2.2.5、百事可乐、定义属性和价格
public class ColdDrinkPepsi extends ColdDrink {
@Override
public float price() {
return 35.0f;
}
@Override
public String name() {
return "百事可乐";
}
}
2.3、套餐组装类Meal
/**
* @author HealerJean
* @version 1.0v
* @ClassName Meal
* @date 2019/8/6 12:59.
* @Description 定义商品集合 套餐
*/
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.name());
System.out.print(", 打包方式 : "+item.packing().pack());
System.out.println(", 价格 : "+item.price());
}
}
}
}
2.4、建造者,组装复杂的实例
public class MealBuilder {
public Meal prepareVegMeal (){
Meal meal = new Meal();
meal.addItem(new BurgerVeg());
meal.addItem(new ColdDrinkCoke());
return meal;
}
public Meal prepareNonVegMeal (){
Meal meal = new Meal();
meal.addItem(new BurgerChicken());
meal.addItem(new ColdDrinkPepsi());
return meal;
}
}
2.5、测试
public class Main {
public static void main(String[] args) {
MealBuilder mealBuilder = new MealBuilder();
Meal oneMeal = mealBuilder.prepareVegMeal();
System.out.println("套餐一");
oneMeal.showItems();
System.out.println("总价格: " +oneMeal.getCost());
System.out.println();
Meal twoMeal = mealBuilder.prepareNonVegMeal();
System.out.println("套餐二");
twoMeal.showItems();
System.out.println("总价格: " +twoMeal.getCost());
}
// 套餐一
// 商品名称: : 蔬菜汉堡, 打包方式 : 塑料袋, 价格 : 25.0
// 商品名称: : 可口可乐, 打包方式 : 瓶装, 价格 : 30.0
// 总价格: 55.0
//
// 套餐二
// 商品名称: : 鸡腿汉堡, 打包方式 : 塑料袋, 价格 : 50.5
// 商品名称: : 百事可乐, 打包方式 : 瓶装, 价格 : 35.0
// 总价格: 85.5
}
3、总结
main方法并不知道,哇原来里面的构造那么复杂,但是一调用就得到了非常简单地结果,所以建造者模式就是为了组装复杂的实例 。
感兴趣的,欢迎添加博主微信
哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。
请下方留言吧。可与博主自由讨论哦
微信 | 微信公众号 | 支付宝 |
---|---|---|