设计模式之生成实例_Builder模式_组装复杂的实例
前言
Github:https://github.com/HealerJean
1、Builder
建造者模式
使用多个简单的对象一步一步构建成一个复杂的对象
比如:肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,我们可以定义一个组装Meal类,和一个建造者类Builder调用这个组装类来制作一个复杂的对象,
main
方法并不知道,哇原来里面的构造那么复杂,但是一调用就得到了非常简单地结果,所以建造者模式就是为了组装复杂的实例 。
1.1、解释
1.1.1、外观模式和建造者模式的区别
1、Builder
的目的是希望用同样的生产过程,根据不同的生产者得到不同的产品。
2、外观模式则是将多个对象组合起来,隐藏复杂的实现,它不需要生产者,也不需要得到不同的结果。
1.2、示例代码:食物打包
1.2.1、食物属性Item
接口
public interface Item {
/** 商品名称 */
String name();
/** 商品价格 */
float price();
/** 打包方式 */
Pack packing();
}
1.2.2、打包方式(接口和实现)
1.2.2.1、定义打包方式接口 Pack
接口
public interface Pack {
String pack();
}
1.2.2.2、汉堡打包方式为塑料袋
public class PackWrapper implements Pack {
@Override
public String pack() {
return "塑料袋";
}
}
1.2.2.3、饮料打包方式为瓶装
public class PackBottle implements Pack {
@Override
public String pack() {
return "瓶装";
}
}
1.2.3、定义食物属性,继承打包接口
public abstract class Burger implements Item {
@Override
public Pack packing() {
return new PackWrapper();
}
}
public abstract class ColdDrink implements Item {
@Override
public Pack packing() {
return new PackBottle();
}
}
1.2.3.1、鸡腿汉堡、定义属性和价格
public class BurgerChicken extends Burger {
@Override
public float price() {
return 50.5f;
}
@Override
public String name() {
return "鸡腿汉堡";
}
}
1.2.3.2、蔬菜汉堡、定义属性和价格
public class BurgerVeg extends Burger {
@Override
public float price() {
return 25.0f;
}
@Override
public String name() {
return "蔬菜汉堡";
}
}
1.2.3.3、可口可乐饮料、定义属性和价格
public class ColdDrinkCoke extends ColdDrink {
@Override
public float price() {
return 30.0f;
}
@Override
public String name() {
return "可口可乐";
}
}
1.2.3.4、百事可乐、定义属性和价格
public class ColdDrinkPepsi extends ColdDrink {
@Override
public float price() {
return 35.0f;
}
@Override
public String name() {
return "百事可乐";
}
}
1.2.4、套餐组装类Meal
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());
}
}
}
1.2.5、建造者,组装复杂的实例建造套装
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
}