0
点赞
收藏
分享

微信扫一扫

设计模式之生成实例_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方法并不知道,哇原来里面的构造那么复杂,但是一调用就得到了非常简单地结果,所以建造者模式就是为了组装复杂的实例 。

设计模式之生成实例_Builder模式_组装复杂的实例_ide

举报

相关推荐

0 条评论