设计模式 - 建造者模式(Builder Pattern)
介绍
建造者模式是一种创建型设计模式,它允许你逐步构造一个复杂的对象。该模式允许你使用相同的构建过程来创建不同类型和表示的对象。建造者模式的主要优点是将构建步骤与表示分离,使得构建过程更加灵活。
实现
我们以一个餐厅点餐系统为例来展示建造者模式的应用。假设餐厅的菜单上有多种套餐,每种套餐可能包含不同的食物和饮料组合。
定义产品类
首先定义一个产品类,它代表了我们要构建的复杂对象。
class Meal {
private String food;
private String drink;
public Meal() {}
public void setFood(String food) {
this.food = food;
}
public void setDrink(String drink) {
this.drink = drink;
}
@Override
public String toString() {
return "Meal{" +
"food='" + food + '\'' +
", drink='" + drink + '\'' +
'}';
}
}
定义建造者接口
然后定义一个建造者接口,它声明了构建产品各个部分的方法。
interface MealBuilder {
void buildFood();
void buildDrink();
Meal getMeal();
}
创建具体建造者类
接着创建具体的建造者类,它们实现了 MealBuilder
接口,并提供了具体的构建步骤。
class BurgerFriesMealBuilder implements MealBuilder {
private Meal meal;
public BurgerFriesMealBuilder() {
this.meal = new Meal();
}
@Override
public void buildFood() {
meal.setFood("Burger and Fries");
}
@Override
public void buildDrink() {
meal.setDrink("Soda");
}
@Override
public Meal getMeal() {
return meal;
}
}
class SaladSandwichMealBuilder implements MealBuilder {
private Meal meal;
public SaladSandwichMealBuilder() {
this.meal = new Meal();
}
@Override
public void buildFood() {
meal.setFood("Salad Sandwich");
}
@Override
public void buildDrink() {
meal.setDrink("Juice");
}
@Override
public Meal getMeal() {
return meal;
}
}
创建指挥者类
创建一个指挥者类,它负责指导具体的建造者对象完成产品的构建。
class Waiter {
private MealBuilder builder;
public Waiter(MealBuilder builder) {
this.builder = builder;
}
public void constructMeal() {
builder.buildFood();
builder.buildDrink();
}
public Meal getMeal() {
return builder.getMeal();
}
}
使用建造者模式
接下来,在主程序中使用建造者模式来创建不同的套餐。
public class Restaurant {
public static void main(String[] args) {
MealBuilder burgerMealBuilder = new BurgerFriesMealBuilder();
MealBuilder saladMealBuilder = new SaladSandwichMealBuilder();
Waiter waiter = new Waiter(burgerMealBuilder);
waiter.constructMeal();
Meal burgerMeal = waiter.getMeal();
System.out.println(burgerMeal.toString()); // 输出 Meal{food='Burger and Fries', drink='Soda'}
waiter = new Waiter(saladMealBuilder);
waiter.constructMeal();
Meal saladMeal = waiter.getMeal();
System.out.println(saladMeal.toString()); // 输出 Meal{food='Salad Sandwich', drink='Juice'}
}
}
使用场景
建造者模式适用于以下情况:
- 如果产品内部表征复杂,则不适合使用构建函数来构造对象。
- 如果产品内部表征将改变,则不适合使用继承来构造对象。
- 如果初始化一个对象的过程非常复杂,或者初始化一个对象需要多个步骤。
总结
建造者模式通过将构建过程与表示分离,使得构建过程更加灵活。这种方式不仅增强了代码的可维护性和可扩展性,还能让你在不改变构建过程的前提下,创建出不同类型的对象。
以上就是建造者模式的一个实现案例,希望这篇文章能帮助你理解建造者模式的使用方式及其优势。
评论区