建造者模式
什么是建造者模式?
建造者,用于对复杂对象的构造、初始化,建造者的目的在于把复杂构造过程从不同对象展现中抽离出来,使得同样的构造工序可以展现出不同的产品对象。
建造者模式主要包含四个角色
Product(产品角色): 一个具体的产品对象。
Builder(抽象建造者): 创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder(具体建造者): 实现抽象接口,构建和装配各个部件。
Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
我们经常用饿了么进行点餐,当然点套餐的时候是最划算的,我们以饿了么套餐为例。
产品角色:
1 /**
2 * 具体的产品对象:外卖套餐(包含食物和饮料)
3 */
4 public class Meal {
5 private String food;//食物
6 private String drink;//饮料
7
8 public String getFood() {
9 return food;
10 }
11
12 public void setFood(String food) {
13 this.food = food;
14 }
15
16 public String getDrink() {
17 return drink;
18 }
19
20 public void setDrink(String drink) {
21 this.drink = drink;
22 }
23
24 @Override
25 public String toString() {
26 return "Meal{" +
27 "food='" + food + '\'' +
28 ", drink='" + drink + '\'' +
29 '}';
30 }
31 }
建造者接口:
1 /**
2 * 建造者接口
3 */
4 public interface MealBuilder {
5
6 /**
7 * 建造食物
8 */
9 public void buildFood();
10
11 /**
12 * 建造饮料
13 */
14 public void buildDrink();
15
16 /**
17 * 获取套餐
18 * @return Meal
19 */
20 public Meal getMeal();
21 }
具体建造者A:
1 /**
2 * 具体建造者A,套餐:炒河粉/可乐
3 */
4 public class MealA implements MealBuilder {
5
6 private Meal meal;
7
8 public MealA(){
9 meal = new Meal();
10 }
11
12 @Override
13 public void buildFood() {
14 meal.setFood("炒河粉");
15 }
16
17 @Override
18 public void buildDrink() {
19 meal.setDrink("可乐");
20 }
21
22 @Override
23 public Meal getMeal() {
24 return meal;
25 }
26 }
具体建造者B:
1 /**
2 * 具体建造者B,套餐:炒刀削/雪碧
3 */
4 public class MealB implements MealBuilder {
5
6 private Meal meal;
7
8 public MealB(){
9 meal = new Meal();
10 }
11
12 @Override
13 public void buildFood() {
14 meal.setFood("炒刀削");
15 }
16
17 @Override
18 public void buildDrink() {
19 meal.setDrink("雪碧");
20 }
21
22 @Override
23 public Meal getMeal() {
24 return meal;
25 }
26 }
指挥者:
1 /**
2 * 饿了么:指挥者
3 */
4 public class Elm {
5
6 private MealBuilder mealBuilder;
7
8 public Elm(MealBuilder mealBuilder) {
9 this.mealBuilder = mealBuilder;
10 }
11
12 public void setMealBuilder(MealBuilder mealBuilder) {
13 this.mealBuilder = mealBuilder;
14 }
15
16 public Meal order(){
17 //1、准备食物
18 mealBuilder.buildFood();
19 //2、准备饮料
20 mealBuilder.buildDrink();
21 //两步得到我们要的套餐
22 return mealBuilder.getMeal();
23 }
24 }
测试:
1 public class BuilderTest {
2
3 public static void main(String[] args){
4 Elm elm = new Elm(new MealA());
5 System.out.println(elm.order());
6 elm.setMealBuilder(new MealB());
7 System.out.println(elm.order());
8 }
9 }
结果:
1 Meal{food='炒河粉', drink='可乐'}
2 Meal{food='炒刀削', drink='雪碧'}