当前位置: 首页 > article >正文

建造者模式详解

建造者模式(Builder Pattern)是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。以下是建造者模式的详细解释:
建造者模式的角色组成:
1.  产品类(Product):要创建的复杂对象。
2.  抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。
3.  具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。
4.  指挥者(Director):调用建造者中的方法完成复杂对象的创建,它负责安排已有模块的顺序和构建过程。
建造者模式的优点:
1.  灵活性:可以分步骤地构建复杂对象,使得构建过程更加灵活。
2.  解耦:可以隔离复杂对象的创建和使用,客户端不必关心对象的创建细节。
3.  易扩展:增加新的具体建造者很方便,可以扩展构建器功能,符合开闭原则。
建造者模式的缺点:
1.  增加工作量:需要额外的代码来创建和管理具体建造者类,增加了程序员的工作量。
2.  效率低:相比于其他创建型模式,在运行时效率较低,特别是对象太复杂时。
建造者模式的应用场景:
1.  创建复杂对象:当对象的构建过程比较复杂且需要多个步骤时,例如,创建一份电子商务订单需要多个步骤,如选择商品、填写地址和支付等,这些步骤可以被分别封装成为订单构建器中的不同方法。
2.  多步配置对象:当需要创建一些特定类型的对象,例如复杂的数据结构或配置对象时,这在编写配置文件解析器以及通用数据结构如二叉树等时很有用。
3.  多变的配置对象:当创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但将它们组合在一起的算法却相对稳定。
建造者模式的代码实现:
以下是一个简单的建造者模式的代码实现,以一个餐厅的订单系统为例,顾客可以通过不同的选项来定制他们的餐点:
// 餐点类
class Meal {
    private String mainCourse;
    private String drink;
    private String dessert;

    // 省略setter和getter方法

    @Override
    public String toString() {
        return "Meal{" +
                "mainCourse='" + mainCourse + '\'' +
                ", drink='" + drink + '\'' +
                ", dessert='" + dessert + '\'' +
                '}';
    }
}

// 建造者接口
interface MealBuilder {
    void buildMainCourse(String mainCourse);
    void buildDrink(String drink);
    void buildDessert(String dessert);
    Meal build();
}

// 具体建造者
class ConcreteMealBuilder implements MealBuilder {
    private Meal meal;

    public ConcreteMealBuilder() {
        this.meal = new Meal();
    }

    @Override
    public void buildMainCourse(String mainCourse) {
        meal.setMainCourse(mainCourse);
    }

    @Override
    public void buildDrink(String drink) {
        meal.setDrink(drink);
    }

    @Override
    public void buildDessert(String dessert) {
        meal.setDessert(dessert);
    }

    @Override
    public Meal build() {
        return meal;
    }
}

// 指挥者类
class MealDirector {
    private MealBuilder builder;

    public MealDirector(MealBuilder builder) {
        this.builder = builder;
    }

    public Meal constructMeal(String mainCourse, String drink, String dessert) {
        builder.buildMainCourse(mainCourse);
        builder.buildDrink(drink);
        builder.buildDessert(dessert);
        return builder.build();
    }
}

// 客户端使用
public class Client {
    public static void main(String[] args) {
        MealBuilder builder = new ConcreteMealBuilder();
        MealDirector director = new MealDirector(builder);
        Meal meal = director.constructMeal("Steak", "Wine", "Cheesecake");
        System.out.println(meal);
    }
}

在这个例子中,Meal 类代表餐点,MealBuilder 是建造者接口,ConcreteMealBuilder 是具体建造者,MealDirector 是指挥者,Client 是客户端使用示例。通过建造者模式,可以根据顾客的选择构建不同的餐点,同时保持代码的灵活性和可维护性。


http://www.kler.cn/a/460654.html

相关文章:

  • Fabric环境部署
  • 实现单例模式的五种方式
  • IDEA2023.1修改默认Maven配置
  • 《Vue3实战教程》35:Vue3测试
  • VMware安装配置
  • MySQL有哪些锁?
  • Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析
  • 04、JUC并发编程之:简单概述(四)
  • pg_wal 目录下 wal 日志文件异常累积过大
  • 慧眼识词:解析TF-IDF工作原理
  • python爬虫--小白篇【selenium自动爬取文件】
  • 微信小程序自定义表格样式
  • 2024年度总结
  • 前端多个项目部署在同一个nginx下,前缀不同,配置编写方式
  • 红黑树的左旋右旋
  • MySQL 执行计划:优化查询性能
  • 家政预约小程序04活动管理表结构设计
  • Mac安装Jupyter和nbextensions报错问题
  • OpenStack系列第四篇:云平台基础功能与操作(Dashboard)
  • Spring 创建和管理 Bean 的原理,以及Spring 的单例模式是否线程安全?(有无状态Bean)
  • 电子电器架构 --- 智能座舱与AI结合
  • 数据仓库工具箱—读书笔记02(Kimball维度建模技术概述05、处理缓慢变化维度SCD属性)
  • 基于深度学习的医疗问诊助手
  • Postman[3] 创建Get和Post请求
  • Django中创建自增主键字段的几种方法
  • UEBA-对等组聚类