建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。
例子:麦当劳套餐。一份麦当劳套餐,通常包含一个汉堡,一份冷饮,汉堡又可以分为蔬菜汉堡,鸡肉汉堡等;冷饮可以分为百事可乐,可口可乐等。汉堡使用纸盒包装,冷饮使用杯子包装。那么正个套餐就是一个复杂的对象,下面使用建造者模式构建。
![builder.jpg](http://localhost/static/userImages/20180621/104732_039466_builder.jpg “104732_039466_builder.jpg”建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。
例子:麦当劳套餐。一份麦当劳套餐,通常包含一个汉堡,一份冷饮,汉堡又可以分为蔬菜汉堡,鸡肉汉堡等;冷饮可以分为百事可乐,可口可乐等。汉堡使用纸盒包装,冷饮使用杯子包装。那么正个套餐就是一个复杂的对象,下面使用建造者模式构建。
1创建Item接口,用来表示食物。
1 2 3 4 5 6 7 8 9 10
| package com.notejava.builder;
public interface Item { String name(); Packing packing(); float price(); }
|
2.创建Packing接口,用来表示包装工具。
1 2 3 4 5 6 7 8
| package com.notejava.builder;
public interface Packing { void pack(); }
|
3.创建Packing的实现类Wrapper,用来表示汉堡的包装盒子。
1 2 3 4 5 6 7 8 9 10
| package com.notejava.builder;
public class Wrapper implements Packing { public void pack() {
} }
|
4.创建Packing的实现类Bottle,用来表示装冷饮的杯子。
1 2 3 4 5 6 7 8 9 10
| package com.notejava.builder;
public class Bottle implements Packing { public void pack() {
} }
|
5.创建抽象父类Burger用来表示汉堡,实现Item接口,实现packing方法。
1 2 3 4 5 6 7 8 9 10
| package com.notejava.builder;
public abstract class Burger implements Item { public Packing packing() { return new Wrapper(); } }
|
6.创建Burger的子类VegBurger,代表蔬菜汉堡。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.notejava.builder;
public class VegBurger extends Burger { public String name() { return null; }
public float price() { return 10; } }
|
7.创建Burger的子类ChickenBurger,代表鸡肉汉堡。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.notejava.builder;
public class ChickenBurger extends Burger { public String name() { return null; }
public float price() { return 15; } }
|
8.创建抽象父类ColdDrink用来表示冷饮,实现Item接口,实现packing方法。
1 2 3 4 5 6 7 8 9 10
| package com.notejava.builder;
public abstract class ColdDrink implements Item { public Packing packing() { return new Bottle(); } }
|
9.创建ColdDrink的子类Pepsi用来表示百事可乐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.notejava.builder;
public class Pepsi extends ColdDrink { public String name() { return null; }
public float price() { return 8; } }
|
10.创建ColdDrink的子类Coke用来表示可口可乐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.notejava.builder;
public class Coke extends ColdDrink { public String name() { return null; }
public float price() { return 8; } }
|
11.创建Meal,代表整个套餐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package com.notejava.builder;
import java.util.ArrayList; import java.util.List;
public class Meal { private List items = new ArrayList<>();
public void addItem(Item item) { items.add(item); }
public float getCost() { return items.stream().map(item -> item.price()).reduce(Float::sum).get(); } }
|
12.创建MealBuilder,作为Meal的建造者。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package com.notejava.builder;
public class MealBuilder { public Meal prepareVegMeal() { Burger burger = new VegBurger(); ColdDrink coldDrink = new Pepsi(); Meal meal = new Meal(); meal.addItem(burger); meal.addItem(coldDrink); return meal; }
public Meal prepareNonVegMeal() { Burger burger = new ChickenBurger(); ColdDrink coldDrink = new Coke(); Meal meal = new Meal(); meal.addItem(burger); meal.addItem(coldDrink); return meal; } }
|
13.编写Demo演示类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package com.notejava.builder;
public class Demo { public static void main(String\[\] args) { MealBuilder mealBuilder = new MealBuilder(); Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); System.out.println(nonVegMeal.getCost()); Meal vegMeal = mealBuilder.prepareVegMeal(); System.out.println(vegMeal.getCost()); } } ```)
## 1创建Item接口,用来表示食物。
```java package com.notejava.builder;
public interface Item { String name(); Packing packing(); float price(); }
|
2.创建Packing接口,用来表示包装工具。
1 2 3 4 5 6 7 8
| package com.notejava.builder;
public interface Packing { void pack(); }
|
3.创建Packing的实现类Wrapper,用来表示汉堡的包装盒子。
1 2 3 4 5 6 7 8 9 10
| package com.notejava.builder;
public class Wrapper implements Packing { public void pack() {
} }
|
4.创建Packing的实现类Bottle,用来表示装冷饮的杯子。
1 2 3 4 5 6 7 8 9 10
| package com.notejava.builder;
public class Bottle implements Packing { public void pack() {
} }
|
5.创建抽象父类Burger用来表示汉堡,实现Item接口,实现packing方法。
1 2 3 4 5 6 7 8 9 10
| package com.notejava.builder;
public abstract class Burger implements Item { public Packing packing() { return new Wrapper(); } }
|
6.创建Burger的子类VegBurger,代表蔬菜汉堡。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.notejava.builder;
public class VegBurger extends Burger { public String name() { return null; }
public float price() { return 10; } }
|
7.创建Burger的子类ChickenBurger,代表鸡肉汉堡。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.notejava.builder;
public class ChickenBurger extends Burger { public String name() { return null; }
public float price() { return 15; } }
|
8.创建抽象父类ColdDrink用来表示冷饮,实现Item接口,实现packing方法。
1 2 3 4 5 6 7 8 9 10
| package com.notejava.builder;
public abstract class ColdDrink implements Item { public Packing packing() { return new Bottle(); } }
|
9.创建ColdDrink的子类Pepsi用来表示百事可乐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.notejava.builder;
public class Pepsi extends ColdDrink { public String name() { return null; }
public float price() { return 8; } }
|
10.创建ColdDrink的子类Coke用来表示可口可乐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.notejava.builder;
public class Coke extends ColdDrink { public String name() { return null; }
public float price() { return 8; } }
|
11.创建Meal,代表整个套餐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| package com.notejava.builder;
import java.util.ArrayList; import java.util.List;
public class Meal { private List items = new ArrayList<>();
public void addItem(Item item) { items.add(item); }
public float getCost() { return items.stream().map(item -> item.price()).reduce(Float::sum).get(); } }
|
12.创建MealBuilder,作为Meal的建造者。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package com.notejava.builder;
public class MealBuilder { public Meal prepareVegMeal() { Burger burger = new VegBurger(); ColdDrink coldDrink = new Pepsi(); Meal meal = new Meal(); meal.addItem(burger); meal.addItem(coldDrink); return meal; }
public Meal prepareNonVegMeal() { Burger burger = new ChickenBurger(); ColdDrink coldDrink = new Coke(); Meal meal = new Meal(); meal.addItem(burger); meal.addItem(coldDrink); return meal; } }
|
13.编写Demo演示类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.notejava.builder;
public class Demo { public static void main(String\[\] args) { MealBuilder mealBuilder = new MealBuilder(); Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); System.out.println(nonVegMeal.getCost()); Meal vegMeal = mealBuilder.prepareVegMeal(); System.out.println(vegMeal.getCost()); } }
|