建造者模式

建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。

例子:麦当劳套餐。一份麦当劳套餐,通常包含一个汉堡,一份冷饮,汉堡又可以分为蔬菜汉堡,鸡肉汉堡等;冷饮可以分为百事可乐,可口可乐等。汉堡使用纸盒包装,冷饮使用杯子包装。那么正个套餐就是一个复杂的对象,下面使用建造者模式构建。

![builder.jpg](http://localhost/static/userImages/20180621/104732_039466_builder.jpg “104732_039466_builder.jpg”建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。

例子:麦当劳套餐。一份麦当劳套餐,通常包含一个汉堡,一份冷饮,汉堡又可以分为蔬菜汉堡,鸡肉汉堡等;冷饮可以分为百事可乐,可口可乐等。汉堡使用纸盒包装,冷饮使用杯子包装。那么正个套餐就是一个复杂的对象,下面使用建造者模式构建。

builder.jpg

1创建Item接口,用来表示食物。

1
2
3
4
5
6
7
8
9
10
package com.notejava.builder;

/**
 * @author lyle 2018/6/21 10:01.
 */
public interface Item {
    String name();
    Packing packing();
    float price();
}

2.创建Packing接口,用来表示包装工具。

1
2
3
4
5
6
7
8
package com.notejava.builder;

/**
 * @author lyle 2018/6/21 10:02.
 */
public interface Packing {
    void pack();
}

3.创建Packing的实现类Wrapper,用来表示汉堡的包装盒子。

1
2
3
4
5
6
7
8
9
10
package com.notejava.builder;

/**
 * @author lyle 2018/6/21 10:08.
 */
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;

/**
 * @author lyle 2018/6/21 10:08.
 */
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;

/**
 * @author lyle 2018/6/21 10:03.
 */
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;

/**
 * @author lyle 2018/6/21 10:05.
 */
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;

/**
 * @author lyle 2018/6/21 10:05.
 */
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;

/**
 * @author lyle 2018/6/21 10:03.
 */
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;

/**
 * @author lyle 2018/6/21 10:06.
 */
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;

/**
 * @author lyle 2018/6/21 10:06.
 */
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;

/**
 * @author lyle 2018/6/21 10:13.
 */
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;

/**
 * @author lyle 2018/6/21 10:24.
 */
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;

/**
 * @author lyle 2018/6/21 9:09.
 */
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;

/**
 * @author lyle 2018/6/21 10:01.
 */
public interface Item {
    String name();
    Packing packing();
    float price();
}

2.创建Packing接口,用来表示包装工具。

1
2
3
4
5
6
7
8
package com.notejava.builder;

/**
 * @author lyle 2018/6/21 10:02.
 */
public interface Packing {
    void pack();
}

3.创建Packing的实现类Wrapper,用来表示汉堡的包装盒子。

1
2
3
4
5
6
7
8
9
10
package com.notejava.builder;

/**
 * @author lyle 2018/6/21 10:08.
 */
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;

/**
 * @author lyle 2018/6/21 10:08.
 */
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;

/**
 * @author lyle 2018/6/21 10:03.
 */
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;

/**
 * @author lyle 2018/6/21 10:05.
 */
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;

/**
 * @author lyle 2018/6/21 10:05.
 */
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;

/**
 * @author lyle 2018/6/21 10:03.
 */
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;

/**
 * @author lyle 2018/6/21 10:06.
 */
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;

/**
 * @author lyle 2018/6/21 10:06.
 */
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;

/**
 * @author lyle 2018/6/21 10:13.
 */
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;

/**
 * @author lyle 2018/6/21 10:24.
 */
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;

/**
 * @author lyle 2018/6/21 9:09.
 */
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());
    }
}