设计模式(四) 建造者模式

建造者模式和工厂模式类似,也是一种创建型模式。它们的主要区别在于:工厂模式需要提供一些信息,而对象在最后一步才创建,而建造者模式则是一步一步的创建对象。

一个非常典型的建造者的例子是Java中的StringBuilder,通过一步一步的添加字符串,最后构造不可变的String对象。

当我们要创建的对象本身内部结构比较复杂,或者当配件的组合非常多的时候,就可以考虑使用建造者模式。

直接看代码吧。首先我们需要一些配件类。在这里是饮料、调料盒主食。

public interface Drink {
    String getInfo();
}

public interface Spice {
    String getInfo();
}

public interface Staple {
    String getInfo();
}

然后是使用这些配件的类,也就是饭菜。一般来说这个类比较复杂,不容易一次性生成。

public class Meal {
    private Drink drink;
    private Spice spice;
    private Staple staple;

    public void setDrink(Drink drink) {
        this.drink = drink;
    }

    public void setSpice(Spice spice) {
        this.spice = spice;
    }

    public void setStaple(Staple staple) {
        this.staple = staple;
    }

    void showMeal() {
        System.out.println(staple.getInfo() + ":" + spice.getInfo() + ":" + drink.getInfo());
    }
}

最后是建造者类,建造者负责一步一步的构造最终的类。

public class MealBuilder {
    private Meal meal;

    public MealBuilder() {
        meal = new Meal();
    }

    public MealBuilder addSpice(Spice spice) {
        meal.setSpice(spice);
        return this;
    }

    public MealBuilder addStaple(Staple staple) {
        meal.setStaple(staple);
        return this;
    }

    public MealBuilder addDrink(Drink drink) {
        meal.setDrink(drink);
        return this;
    }

    public Meal build() {
        return meal;
    }
}

最后我们来使用一下建造者类。这里用lambda表达式简化了一些子类的创建。以后如果需要其他的饭菜组合,也可以非常方便的生成。

MealBuilder builder = new MealBuilder();
builder.addDrink(() -> "啤酒");
builder.addSpice(() -> "辣椒");
builder.addStaple(() -> "炸鸡");
Meal meal = builder.build();
meal.showMeal();
上一篇:C#新功能--命名参数与可选参数


下一篇:数据集大全:25个深度学习的开放数据集