什么是构建者模式(Builder)?

108 阅读1分钟

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

  1. 意图
    创建复杂对象,相同的过程,不同的组合。
  2. 类图
    在这里插入图片描述
  3. 实例
interface Item {
    String name();
    Packing packing();
    float price();
}

interface Packing {
    String pack();
}

class Wrapper implements Packing {
    @Override
    public String pack() {
        return "Wrapper";
    }
}

class Bottle implements Packing {
    @Override
    public String pack() {
        return "Bottle";
    }
}

abstract class Burger implements Item {
    @Override
    public Packing packing() {
        return new Wrapper();
    }
}

abstract class ColdDrink implements Item {
    @Override
    public Packing packing() {
        return new Bottle();
    }
}

class VegBurger extends Burger {
    @Override
    public String name() {
        return "VegBurger";
    }
    @Override
    public float price() {
        return 25.0F;
    }
}

class ChickenBurger extends Burger {
    @Override
    public String name() {
        return "ChickenBurger";
    }

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

class Coke extends ColdDrink {
    @Override
    public String name() {
        return "Coke";
    }

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

class Pepsi extends ColdDrink {
    @Override
    public String name() {
        return "Pepsi";
    }

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

class Meal {
    List<Item> itemList = new ArrayList<>();

    public void addItem(Item item) {
        itemList.add(item);
    }

    public float getCost() {
        return itemList.stream().map(Item::price).reduce((a, b) -> a + b).get();
    }

    public void showItems() {
        itemList.forEach((item) -> {
            StringBuilder sb = new StringBuilder();
            String itemStr = sb.append("name").append(" : ").append(item.name()).append(",")
                    .append(" ").append("packing").append(" : ").append(item.packing().pack()).append(",")
                    .append(" ").append("price").append(" : ").append(item.price())
                    .toString();
            System.out.println(itemStr);
        });
    }
}

class MealBuilder {
    private MealBuilder(){}
    public static MealBuilder create(){
        return new MealBuilder();
    }

    public MealBuilder vegMeal(){
        Meal meal = new Meal();
        meal.addItem(new VegBurger());
        meal.addItem(new Coke());
        meal.showItems();
        System.out.println("cost : " + meal.getCost());
        return this;
    }

    public MealBuilder nonVegMeal(){
        Meal meal = new Meal();
        meal.addItem(new ChickenBurger());
        meal.addItem(new Pepsi());
        meal.showItems();
        System.out.println("cost : " + meal.getCost());
        return this;
    }
}
  1. 测试
class BuilderTest {
    public static void main(String[] args) {
        MealBuilder.create().vegMeal().nonVegMeal();
    }
}

运行结果:

name : VegBurger, packing : Wrapper, price : 25.0
name : Coke, packing : Bottle, price : 30.0
cost : 55.0
name : ChickenBurger, packing : Wrapper, price : 50.0
name : Pepsi, packing : Bottle, price : 35.0
cost : 85.0

想看更多吗?请访问:设计模式