建造者模式和工廠模式類似冗荸,也是一種創(chuàng)建型模式父阻。它們的主要區(qū)別在于:工廠模式需要提供一些信息,而對(duì)象在最后一步才創(chuàng)建侄旬,而建造者模式則是一步一步的創(chuàng)建對(duì)象肺蔚。
一個(gè)非常典型的建造者的例子是Java中的StringBuilder,通過一步一步的添加字符串儡羔,最后構(gòu)造不可變的String對(duì)象宣羊。
當(dāng)我們要?jiǎng)?chuàng)建的對(duì)象本身內(nèi)部結(jié)構(gòu)比較復(fù)雜璧诵,或者當(dāng)配件的組合非常多的時(shí)候,就可以考慮使用建造者模式仇冯。
直接看代碼吧之宿。首先我們需要一些配件類。在這里是飲料苛坚、調(diào)料盒主食比被。
public interface Drink {
String getInfo();
}
public interface Spice {
String getInfo();
}
public interface Staple {
String getInfo();
}
然后是使用這些配件的類,也就是飯菜泼舱。一般來說這個(gè)類比較復(fù)雜等缀,不容易一次性生成。
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());
}
}
最后是建造者類柠掂,建造者負(fù)責(zé)一步一步的構(gòu)造最終的類项滑。
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表達(dá)式簡(jiǎn)化了一些子類的創(chuàng)建涯贞。以后如果需要其他的飯菜組合,也可以非常方便的生成危喉。
MealBuilder builder = new MealBuilder();
builder.addDrink(() -> "啤酒");
builder.addSpice(() -> "辣椒");
builder.addStaple(() -> "炸雞");
Meal meal = builder.build();
meal.showMeal();