前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

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
}