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

设计模式-建造者(生成器)模式

文章目录

  • 简介
  • 建造者模式的核心概念
    • 产品(Product)
    • 建造者(Builder)
    • 指挥者(Director)
    • 建造者模式与其他设计模式的关系
      • 工厂模式和建造者模式uml对比
  • 建造者模式的实现步骤
  • 建造者模式的应用场景
    • spring中应用
  • 建造者模式的优缺点
    • 优点
    • 缺点
  • 简单总结

简介

在本文中,我们将介绍建造者模式的概念、作用和优势,并探讨它与其他设计模式的关系。

建造者模式的核心概念

在这里插入图片描述

产品(Product)

产品是由建造者创建的复杂对象,它具有多个属性和方法。在建造者模式中,产品是建造者的最终结果。

建造者(Builder)

建造者是负责构建产品的接口。它定义了创建产品的步骤和方法,通常包括设置属性和返回最终产品的方法。

指挥者(Director)

指挥者是负责协调建造者的对象。它指导建造者按照特定的顺序执行构建步骤,以生成最终产品。

建造者模式与其他设计模式的关系

建造者模式通常与以下设计模式相关联:

  • 抽象工厂模式:抽象工厂模式用于创建一系列相互依赖或相互关联的对象,而建造者模式用于创建复杂对象。两者的区别在于,抽象工厂模式强调一系列产品的创建,而建造者模式则侧重于单个复杂对象的创建。
  • 工厂模式:工厂模式用于根据某些条件创建不同类型的对象,而建造者模式则用于创建复杂对象。两者的区别在于,工厂模式强调对象类型的选择,而建造者模式侧重于对象的组装过程。

工厂模式和建造者模式uml对比

在这里插入图片描述
在这里插入图片描述

建造者模式的实现步骤

以下是实现建造者模式的步骤:

  1. 定义产品的属性和方法,确保产品具有所需的特性。
  2. 创建抽象建造者接口,其中包含创建产品的方法和设置产品属性的方法。
  3. 创建具体建造者类,实现建造者接口,并实现创建产品和设置属性的方法。
  4. 实现指挥者类,它接收一个建造者对象,并根据特定的顺序调用建造者的方法来构建产品。
  5. 编写客户端代码,实例化指挥者和具体建造者对象,并调用指挥者的构建方法来获取最终产品。

以下是一个示例代码:

// 产品类
public class Product {private String attribute1;private String attribute2;// 设置属性的方法public void setAttribute1(String attribute1) {this.attribute1 = attribute1;}public void setAttribute2(String attribute2) {this.attribute2 = attribute2;}public void Show(){System.out.println(attribute1);System.out.println(attribute2);}// 其他方法...
}// 抽象建造者接口
public interface Builder {void buildAttribute1(String attribute1);void buildAttribute2(String attribute2);Product getResult();
}// 具体建造者类
public class ConcreteBuilder implements Builder {private Product product;public ConcreteBuilder() {this.product = new Product();}@Overridepublic void buildAttribute1(String attribute1) {System.out.println("设置Attribute1");product.setAttribute1(attribute1);}@Overridepublic void buildAttribute2(String attribute2) {System.out.println("设置Attribute2");product.setAttribute2(attribute2);}@Overridepublic Product getResult() {return product;}
}// 指挥者类
public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void construct() {System.out.println("指挥建造开始-----------");builder.buildAttribute1("Value 1");builder.buildAttribute2("Value 2");// 还可以按照特定顺序调用其他建造者方法}
}// 客户端代码
public class Client {public static void main(String[] args) {Builder builder = new ConcreteBuilder();Director director = new Director(builder);director.construct();Product product = builder.getResult();product.Show();// 使用产品...}
}

在这里插入图片描述

建造者模式的应用场景

建造者模式常用于以下情况:

  • 创建复杂对象,其中对象的创建过程较为复杂,需要多个步骤和组件参与。
  • 对象的构建过程需要独立于其组装方式,允许在同一个构建过程中使用不同的建造者来创建不同的表示。
  • 希望改变产品的内部表示,而不影响产品的整体结构。

spring中应用

在 Spring 框架中,建造者模式的应用主要体现在 Bean 的创建和配置过程中。Spring 使用了建造者模式来构建和配置各种类型的 Bean。

具体来说,Spring 中的建造者模式主要包括以下几个核心组件:

  1. ApplicationContext(应用上下文):在 Spring 中,通常使用 ApplicationContext 来管理和配置 Bean。ApplicationContext 负责创建和管理 Bean,并负责处理 Bean 的依赖关系和生命周期等。ApplicationContext 可以通过 XML 配置文件、注解或 Java 代码来配置和创建 Bean。

  2. BeanDefinitionBuilder:BeanDefinitionBuilder 是 Spring 提供的一个用于构建 BeanDefinition(Bean 定义)的建造者类。BeanDefinitionBuilder 提供了一系列的方法,用于配置 Bean 的各个属性和依赖关系等。通过链式调用这些方法,可以根据需求设置 BeanDefinition 的各个属性。

  3. BeanFactory:BeanFactory 是 Spring 的核心接口之一,它负责创建和管理 Bean。在创建 Bean 时,通常会使用 BeanFactory 来创建 Bean 实例,并将其配置和初始化。

  4. XML 配置文件:在 Spring 中,可以使用 XML 配置文件来配置和描述 Bean 的信息。XML 配置文件中的 元素通常对应着一个 Bean 对象,通过配置元素的属性和子元素,可以设置 Bean 的各个属性和依赖关系等。

在使用 Spring 的过程中,开发者通常会使用 ApplicationContext 作为主要的建造者角色,通过配置和调用它提供的方法来创建和管理各种类型的 Bean。开发者可以使用 BeanDefinitionBuilder 构建 Bean 定义,并将其注册到 ApplicationContext 中,以实现对 Bean 的自定义配置和构建过程。

总结起来,Spring 在 Bean 的创建和配置过程中使用了建造者模式,通过 ApplicationContext、BeanDefinitionBuilder、BeanFactory 和 XML 配置文件等组件来实现对 Bean 的构建和配置。使用建造者模式可以简化 Bean 的创建和配置过程,提高灵活性和可维护性。

建造者模式的优缺点

优点

  • 分离构建过程和表示,使得相同的构建过程可以创建不同的表示。
  • 提供灵活的配置选项,客户端可以根据需求自由选择建造者和创建的步骤。
  • 允许改变产品的内部表示,对客户端代码透明。

缺点

  1. 增加了代码量:建造者模式需要创建具体建造者类、指挥者类等额外的类,从而增加了代码量。每个产品的构建过程可能不同,因此可能需要创建多个具体建造者类。虽然这些额外的类增加了一定的开销,但可以提高代码的可维护性和灵活性。

  2. 组装顺序需要开发者控制:在建造者模式中,开发者需要控制对象构建过程的组装顺序。如果组装顺序不正确,可能导致产品组装错误或缺失某些部分。因此,开发者需要仔细设计和控制组装顺序,增加了设计的复杂性。

简单总结

建造者模式通过将对象的构建过程封装起来,使得建造过程和表示分离,并提供灵活的配置选项。通过抽象建造者、具体建造者和指挥者的协作,客户端可以获得不同的产品表示。然而,建造者模式增加了代码量,并对构建顺序有一定要求。

http://www.lryc.cn/news/160374.html

相关文章:

  • 内存泄露排查思路
  • kafka学习-概念与简单实战
  • 爬虫进阶-反爬破解5(selenium的优势和点击操作+chrome的远程调试能力+通过Chrome隔离实现一台电脑登陆多个账号)
  • 音视频编码格式-AAC ADT
  • 【计算机网络】网络编程接口 Socket API 解读(3)
  • kafka知识小结
  • 算法刷题记录-DP(LeetCode)
  • Springboot整合Neo4J图数据库
  • Unity 2018发布在iOS 16.3偶尔出现画面不动的问题
  • 蠕虫病毒流量分析案例
  • Transformer(一)—— Attention Batch Normalization
  • 2023高教社杯数学建模C题思路代码 - 蔬菜类商品的自动定价与补货决策
  • 【C++漂流记】一文搞懂类与对象的封装
  • ctfshow 反序列化
  • 数据结构:线性表之-单向链表(无头)
  • 为IT服务台构建自定义Zia操作
  • 【C/C++】BMP格式32位转24位
  • 合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)
  • SQLAlchemy 封装的工具类,数据库pgsql(数据库连接池)
  • 【Git】Git 基础
  • 腾讯云AI绘画:探究AI创意与技术的新边界
  • 离线数仓同步数据1
  • c语言开篇---跟着视频学C语言
  • 本地yum源-如学
  • 【实训】“宅急送”订餐管理系统(程序设计综合能力实训)
  • openeuler上安装polarismesh集群
  • Java基础——stream
  • Spring Quartz 持久化解决方案
  • 基于Java+SpringBoot+Vue前后端分离火锅店管理系统设计和实现
  • Unity——导航系统补充说明