制作者模式(Builder Pattern)

[复制链接]
发表于 2025-12-23 00:17:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
制作者模式(Builder Pattern)

制作者模式是一种 创建型计划模式,它将一个复杂对象的构造与它的表现分离,使得同样的构建过程可以创建差别的表现。

原理


  • 核心头脑:通过一步步的构建过程来创建复杂对象,而不是直接调用构造函数。
  • 实用场景:必要创建的对象包罗多个部分,且构造过程相对复杂时。
  • 到场脚色:

    • Builder(抽象制作者):界说构建产物各部分的抽象接口。
    • ConcreteBuilder(详细制作者):实现 Builder 接口,构造并装配详细的产物。
    • Product(产物):要创建的复杂对象。
    • Director(指挥者):界说构造步调的次序,将构建过程委托给制作者对象。


优点


  • 分步构建:允许通太过步调的方式构造对象,构造过程清晰。
  • 易于扩展:可以机动地创建差别的对象表现。
  • 解耦构建过程与表现:更易维护和扩展。

缺点


  • 复杂性增长:对于简单对象的创建会显得过于复杂。
  • 依靠 Director:必要额外引入指挥者脚色。

示例代码

场景形貌

计划一个 MealBuilder 用于创建差别范例的套餐(如素食套餐和非素食套餐)。每个套餐包罗主食(主菜)、饮料和甜品。

1. 界说产物类
  1. // 产品类:Meal
  2. public class Meal {
  3.     private String mainCourse;
  4.     private String drink;
  5.     private String dessert;
  6.     // Setter 方法
  7.     public void setMainCourse(String mainCourse) {
  8.         this.mainCourse = mainCourse;
  9.     }
  10.     public void setDrink(String drink) {
  11.         this.drink = drink;
  12.     }
  13.     public void setDessert(String dessert) {
  14.         this.dessert = dessert;
  15.     }
  16.     // 展示方法
  17.     public void showItems() {
  18.         System.out.println("Meal contains:");
  19.         System.out.println("Main Course: " + mainCourse);
  20.         System.out.println("Drink: " + drink);
  21.         System.out.println("Dessert: " + dessert);
  22.     }
  23. }
复制代码

2. 界说抽象制作者
  1. // 抽象建造者
  2. public abstract class MealBuilder {
  3.     protected Meal meal = new Meal();
  4.     public abstract void buildMainCourse();
  5.     public abstract void buildDrink();
  6.     public abstract void buildDessert();
  7.     // 返回构建好的产品
  8.     public Meal getMeal() {
  9.         return meal;
  10.     }
  11. }
复制代码

3. 界说详细制作者
  1. // 具体建造者:素食套餐
  2. public class VegMealBuilder extends MealBuilder {
  3.     @Override
  4.     public void buildMainCourse() {
  5.         meal.setMainCourse("Vegetable Curry");
  6.     }
  7.     @Override
  8.     public void buildDrink() {
  9.         meal.setDrink("Lemonade");
  10.     }
  11.     @Override
  12.     public void buildDessert() {
  13.         meal.setDessert("Fruit Salad");
  14.     }
  15. }
  16. // 具体建造者:非素食套餐
  17. public class NonVegMealBuilder extends MealBuilder {
  18.     @Override
  19.     public void buildMainCourse() {
  20.         meal.setMainCourse("Chicken Curry");
  21.     }
  22.     @Override
  23.     public void buildDrink() {
  24.         meal.setDrink("Coke");
  25.     }
  26.     @Override
  27.     public void buildDessert() {
  28.         meal.setDessert("Ice Cream");
  29.     }
  30. }
复制代码

4. 界说指挥者
  1. // 指挥者
  2. public class MealDirector {
  3.     private MealBuilder builder;
  4.     public MealDirector(MealBuilder builder) {
  5.         this.builder = builder;
  6.     }
  7.     public Meal constructMeal() {
  8.         builder.buildMainCourse();
  9.         builder.buildDrink();
  10.         builder.buildDessert();
  11.         return builder.getMeal();
  12.     }
  13. }
复制代码

5. 客户端代码
  1. public class BuilderPatternExample {
  2.     public static void main(String[] args) {
  3.         // 构建素食套餐
  4.         MealBuilder vegMealBuilder = new VegMealBuilder();
  5.         MealDirector vegDirector = new MealDirector(vegMealBuilder);
  6.         Meal vegMeal = vegDirector.constructMeal();
  7.         System.out.println("Veg Meal:");
  8.         vegMeal.showItems();
  9.         System.out.println("----------------------");
  10.         // 构建非素食套餐
  11.         MealBuilder nonVegMealBuilder = new NonVegMealBuilder();
  12.         MealDirector nonVegDirector = new MealDirector(nonVegMealBuilder);
  13.         Meal nonVegMeal = nonVegDirector.constructMeal();
  14.         System.out.println("Non-Veg Meal:");
  15.         nonVegMeal.showItems();
  16.     }
  17. }
复制代码

输出结果
  1. Veg Meal:
  2. Meal contains:
  3. Main Course: Vegetable Curry
  4. Drink: Lemonade
  5. Dessert: Fruit Salad
  6. ----------------------
  7. Non-Veg Meal:
  8. Meal contains:
  9. Main Course: Chicken Curry
  10. Drink: Coke
  11. Dessert: Ice Cream
复制代码

UML 类图
  1.       +----------------+
  2.       |   Meal         |
  3.       +----------------+
  4.       | - mainCourse   |
  5.       | - drink        |
  6.       | - dessert      |
  7.       +----------------+
  8.       | + setXXX()     |
  9.       | + showItems()  |
  10.       +----------------+
  11.                ^
  12.                |
  13.       +----------------+
  14.       | MealBuilder    |
  15.       +----------------+
  16.       | + buildXXX()   |
  17.       | + getMeal()    |
  18.       +----------------+
  19.          /         \
  20. +---------------+   +-----------------+
  21. | VegMealBuilder|   | NonVegMealBuilder|
  22. +---------------+   +-----------------+
  23.                ^
  24.                |
  25.       +----------------+
  26.       | MealDirector   |
  27.       +----------------+
  28.       | - builder      |
  29.       | + constructMeal|
  30.       +----------------+
复制代码

实用场景


  • 复杂对象的创建:对象包罗多个构成部分,且构建次序不可或缺。
  • 构造过程稳固,表现多样:同一构造流程可用于创建差别表现的对象。
  • 代码清晰:通太过离构造过程简化了客户端逻辑。

小结


  • 制作者模式得当构建复杂对象并关注构建过程的场景。
  • 它将产物的创建与表现分离,进步了机动性和扩展性。
  • 缺点:当产物构造步调或范例较少时,使用该模式大概显得冗余。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表