世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
- 意图
创建复杂对象,相同的过程,不同的组合。 - 类图
- 实例
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;
}
}
- 测试
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