建造者模式和工厂模式类似,也是一种创建型模式。它们的主要区别在于:工厂模式需要提供一些信息,而对象在最后一步才创建,而建造者模式则是一步一步的创建对象。
一个非常典型的建造者的例子是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();