Github:BuilderPattern

    我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。
    我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。
    然后我们创建一个 Meal 类,带有 ItemArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilderBuilderPatternDemo 类使用 MealBuilder 来创建一个 Meal
    建造者模式 - 图1

    1. 共同特性的接口类 ```java /**
      • 产品:所有产品共同特性 */ public interface Item{ String name(); float price(); Packing packing(); }

    /**

    • 产品包装接口 */ public interface Packing{ String pack(); }
    1. 2. 包装实现类
    2. ```java
    3. /**
    4. * 杯子包装
    5. */
    6. public class Bottle implements Packing{
    7. @Override
    8. public String pack() {
    9. return "bottle";
    10. }
    11. }
    12. /**
    13. * 纸盒包装
    14. */
    15. public class Wrapper implements Packing{
    16. @Override
    17. public String pack() {
    18. return "wrapper";
    19. }
    20. }
    1. 汉堡和冷饮抽象类 ```java /**

      • 汉堡抽象类 */ public abstract class Burger implements Item{

        @Override public Packing packing() { return new Wrapper(); } }

    /**

    • 冷饮抽象类 */ public abstract class ColdDrink implements Item{ @Override public Packing packing() {
      1. return new Bottle();
      } } ```
    1. 汉堡实现类 ```java /**

      • 素菜汉堡 */ public class VegBurger extends Burger{ @Override public String name() { return “VegBurger”; }

        @Override public float price() { return 3.05F; } }

    /**

    • 鸡肉汉堡 */ public class ChickenBurger extends Burger{ @Override public String name() {

      1. return "Chicken Burger";

      }

      @Override public float price() {

      1. return 12.56F;

      } } ```

    1. 各种冷饮的实现类 ```java

    /**

    • 可口可乐 */ public class Coke extends ColdDrink{ @Override public String name() {

      1. return "coke";

      }

      @Override public float price() {

      1. return 3.6F;

      } }

    /**

    • 百事可乐 */ public class Pepsi extends ColdDrink{ @Override public String name() {

      1. return "Pepsi";

      }

      @Override public float price() {

      1. return 3.65F;

      } } ```

    1. 套餐类

      1. /**
      2. * 套餐:可以有多个汉堡或多个冷饮,所以直接添加item
      3. */
      4. public class Meal{
      5. private List<Item> items = new ArrayList<>();
      6. private float cost = 0;
      7. public void addItem(Item item){
      8. items.add(item);
      9. cost += item.price();
      10. }
      11. public float getCost(){
      12. return cost;
      13. }
      14. public void showItem(){
      15. for (Item item : items) {
      16. System.out.println(String.format("Item: %s, Packing: %s, Price: %s", item.name(), item.packing().pack(), item.price()));
      17. }
      18. }
      19. }
    2. 构建套餐

      1. /**
      2. * 套餐构建
      3. */
      4. public class MealBuilder{
      5. public Meal buildVegMeal(){
      6. Meal meal = new Meal();
      7. meal.addItem(new VegBurger());
      8. meal.addItem(new Coke());
      9. return meal;
      10. }
      11. public Meal buildChickenMeal(){
      12. Meal meal = new Meal();
      13. meal.addItem(new ChickenBurger());
      14. meal.addItem(new Pepsi());
      15. return meal;
      16. }
      17. }
    3. 测试,购买套餐 ```java

    public static void main(String[] args) { BuilderPattern builderPattern = new BuilderPattern(); builderPattern.build(); }

    private void build() { MealBuilder builder = new MealBuilder(); Meal meal = builder.buildVegMeal(); System.out.println(“veg meal:”); meal.showItem(); System.out.println(“the meal total cost: “+meal.getCost());

    1. System.out.println();
    2. meal = builder.buildChickenMeal();
    3. System.out.println("chicken meal:");
    4. meal.showItem();
    5. System.out.println("the meal total cost: "+meal.getCost());

    }

    1. 输出结果:
    2. ```java
    3. veg meal:
    4. Item: VegBurger, Packing: wrapper, Price: 3.05
    5. Item: coke, Packing: bottle, Price: 3.6
    6. the meal total cost: 6.6499996
    7. chicken meal:
    8. Item: Chicken Burger, Packing: wrapper, Price: 12.56
    9. Item: Pepsi, Packing: bottle, Price: 3.65
    10. the meal total cost: 16.210001

    参考
    菜鸟教程 - 建造者模式