目录

建造者模式

Builder

目录

定义

建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式构建复杂对象就像造汽车一样,是一个一个组件一个一个步骤创建出来的,它允许用户通过制定的对象类型和内容来创建他们,但是用户并不需要知道这个复杂对象是如何构建的,它只需要明白通过这样做我可以得到一个完整的复杂对象实例。

建造者返回给客户一个完整的的产品对象,而客户端无须关心该对象所包含的额属性和组建方式,这就是建造者模式的设计动机。

角色:

  • Builder:抽象建造者。它声明为创建一个Product对象的各个部件指定的抽象接口。
  • ConcreteBuilder:具体建造者。实现抽象接口,构建和装配各个部件。
  • Director:指挥者。构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
  • Product:产品角色。一个具体的产品对象。

实现

套餐类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class Meal {
    private String food;
    private String drink;
    public String getFood() {
        return food;
    }
    public void setFood(String food) {
        this.food = food;
    }
    public String getDrink() {
        return drink;
    }
    public void setDrink(String drink) {
        this.drink = drink;
    }
}

套餐构造器

1
2
3
4
5
6
7
8
public abstract class MealBuilder {
    Meal meal = new Meal();    
    public abstract void buildFood();    
    public abstract void buildDrink();    
    public Meal getMeal(){
        return meal;
    }
}

实现抽象套餐类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class MealA extends MealBuilder{
    public void buildDrink() {
        meal.setDrink("一杯可乐");
    }
    public void buildFood() {
        meal.setFood("一盒薯条");
    }
}
public class MealB extends MealBuilder{
    public void buildDrink() {
        meal.setDrink("一杯柠檬果汁");
    }
    public void buildFood() {
        meal.setFood("三个鸡翅");
    }
}

KFC的服务员

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class KFCWaiter {
    private MealBuilder mealBuilder;    
    public void setMealBuilder(MealBuilder mealBuilder) {
        this.mealBuilder = mealBuilder;
    }
    public Meal construct(){
        //准备食物
        mealBuilder.buildFood();
        //准备饮料
        mealBuilder.buildDrink();        
        //准备完毕,返回一个完整的套餐给客户
        return mealBuilder.getMeal();
    }
}

测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public class Client {
    public static void main(String[] args) {
        //服务员
        KFCWaiter waiter = new KFCWaiter();
        //套餐A
        MealA a = new MealA();
        //服务员准备套餐A
        waiter.setMealBuilder(a);
        //获得套餐
        Meal mealA = waiter.construct();
        
        System.out.print("套餐A的组成部分:");
        System.out.println(mealA.getFood()+"---"+mealA.getDrink());
    }
}