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



感兴趣的,欢迎添加博主微信

哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。

请下方留言吧。可与博主自由讨论哦

微信 微信公众号 支付宝
微信 微信公众号 支付宝
posted @ 2019-08-23 16:57  HealerJean  阅读(162)  评论(0编辑  收藏  举报