建造者模式

什么是建造者模式?

  建造者,用于对复杂对象的构造、初始化,建造者的目的在于把复杂构造过程从不同对象展现中抽离出来,使得同样的构造工序可以展现出不同的产品对象。

建造者模式主要包含四个角色

  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='雪碧'}

 

posted on 2019-10-16 17:26  夜深思  阅读(193)  评论(0编辑  收藏  举报