1.定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.角色
- Builder:建造者
- ConcreteBuilder:具体建造者
- Director:指挥者
- Product:产品
3.特点
- 优点:将产品本身与产品创建过程解耦,每一个具体建造者都相对独立,因此可以方便地替换或新增具体建造者。
- 缺点:如果产品内部变化复杂,则需要许多具体建造者来应对这些变化而使系统变得复杂。
4.示例:KFC套餐
套餐(产品类):
public class Meal {
public String food;
public 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;
}
}
抽象建造者:
public abstract class MealBuilder {
Meal meal = new Meal();
abstract void buildFood();
abstract void buildDrink();
Meal getMeal() {
return meal;
}
}
具体建造者:
// 套餐A
public class SubMealBuilderA extends MealBuilder {
@Override
void buildFood() {
meal.setFood("薯条");
}
@Override
void buildDrink() {
meal.setDrink("奶茶");
}
}
// 套餐B
public class SubMealBuilderB extends MealBuilder {
@Override
void buildFood() {
meal.setFood("鸡翅");
}
@Override
void buildDrink() {
meal.setDrink("可乐");
}
}
服务员(指挥者):
public class Waiter {
public MealBuilder mealBuilder;
public Waiter(MealBuilder mealBuilder) {
this.mealBuilder = mealBuilder;
}
public Meal construct() {
mealBuilder.buildDrink();
mealBuilder.buildFood();
return mealBuilder.getMeal();
}
}
测试类:
public class TestBuilder {
public static void main(String[] args) {
MealBuilder mealBuilder = new SubMealBuilderA();
Waiter waiter = new Waiter(mealBuilder);
Meal meal = waiter.construct();
System.out.println(meal.getFood());
System.out.println(meal.getDrink());
}
}
// 输出
// 薯条
// 奶茶
参考:
1. 《Head First 设计模式》
2. 《图说设计模式》 https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html
3. https://blog.csdn.net/qq_34337272/article/details/80540059