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

文章目录

  • 简介
  • 建造者模式的核心概念
    • 产品(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.mzph.cn/news/69244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文《面向大规模日志数据分析的自动化日志解析》翻译

论文《Towards Automated Log Parsing for Large-Scale Log Data Analysis》翻译 面向大规模日志数据分析的自动化日志解析翻译

Windows中多线程的基础知识1——互斥对象

目录 1 多线程的基本概念1.1 进程一、程序和进程的概念二、进程组成三、进程地址空间 1.2 线程一、线程组成二、线程运行三、线程创建函数 1.3 多进程与多线程并发一、多进程并发二、多线程并发 2 线程同步2.1 一个经典的线程同步问题2.2 利用互斥对象实现线程同步一、创建互斥…

JavaScript-----对象(创建对象、数组与字符串)

目录 前言: 1. JavaScript创建对象 1.1 对象的创建 1.2 对象的调用 1.3 for-in循环语句 2.内置对象 2.1 Array(数组)对象 属性和方法 2.2 String(字符串)对象 属性和方法 2.3 Math对象 2.4 日期对象 前言&a…

SIEM 中不同类型日志监控及分析

安全信息和事件管理(SIEM)解决方案通过监控来自网络的不同类型的数据来确保组织网络的健康安全状况,日志数据记录设备上发生的每个活动以及整个网络中的应用程序,若要评估网络的安全状况,SIEM 解决方案必须收集和分析不…

【Docker】Docker基本使用介绍

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。 一、安装Docker 首先,你需要从官方网站上下载Docker的安装包,并按…

mysql数据库使用技巧整理

查看当前数据库已建立的client连接 mysql中执行 -- 查看数据库允许的最大连接数,不是实时正在使用的连接数 SHOW VARIABLES LIKE max_connections; mysql中执行 -- 查看当前数据库client的连接数 SHOW STATUS LIKE Threads_connected; mysql中执行 -- 查看具…

算法通关村十三关-白银:数字与数学高频问题

有很多解题技巧,需要持续积累 1.数组实现加法专题 如果让你用数组来表示一个数,如何实现加法呢? 理论上仍然从数组末尾向前挨着计算就行了,但是实现的时候会发现很多问题,例如需要进位该怎么办? 进一步拓…

第三课:C++实现PDF去水印

PDF去水印是一项非常复杂的任务,需要一定的计算机图形学知识和技术,也需要使用到一些专业的工具库。以下是一种可能的实现方法: 首先,需要将PDF文件解析成一系列图形元素,包括文字、矢量图形等。可以使用开源库Poppler或MuPDF来解析PDF文件。 接下来,需要判断PDF文件是否…

微服务-gateway基本使用

文章目录 一、前言二、gateway网关1、什么是微服务网关?2、微服务架构下网关的重要性2.1、没有网关2.2、有网关 3、gateway的功能4、gateway实战4.1、依赖配置4.2、添加网关配置4.3、添加网关启动类4.4、查看项目是否启动成功4.5、验证路由配置是否正确 三、总结 一…

行业追踪,2023-09-04

自动复盘 2023-09-04 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

2023年高教社杯 国赛数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法,其…

用Qt自制一个小闹钟

小闹钟 功能 当按下启动按钮时,停止按钮可用,启动按钮不可用,闹钟无法设置,无法输入自定义内容 当按下停止按钮时,暂停播报,启动按钮可用,闹钟可以设置,可以输入自定义内容 .pro文…

Springboot项目bootstrap配置未生效、application.yml未读取bootstrap配置文件参数

场景 Springboot项目,application.yml未读取bootstrap配置文件参数 原因 Springboot项目不读取bootstrap.yml配置文件!!! SpringCloud项目才读取bootstrap.yml配置文件!!!

分布式环境集成JWT(Java Web Token)

目录 一,说明:二,Token、Session和Cookie比较三,Spring Boot项目集成JWT1,引入依赖2,Token工具类3,定义拦截器4,注册拦截器5,编写登录代码6,测试 四&#xff…

Python3.11教程3:模块和包(pip/conda)、文件系统(os/ shutil/json/pickle/openpyxl/xlrd)

文章目录 七、模块和包7.1 模块7.1.1 模块搜索路径7.1.2 PYTHONPATH和sys.path7.1.2 模块的导入和常见错误7.1.3 模块的缓存机制7.1.4 __name__ 和 __main__ 函数 7.2 标准库7.3 包7.3.1 创建包7.3.2 导入包7.3.3 pip包管理器7.3.4 conda 7.4 如何组织和管理大型项目中的模块与…

Vue 2 nextTick方法|异步更新|事件循环

1 nextTick的用处 vm.$netTick的作用是将回调延迟到下次DOM更新周期之后执行。 它接受一个回调函数作为参数。 其实&#xff0c;在我们更新数据状态后&#xff0c;是不会立马渲染的&#xff0c;你不能即刻获取到新的DOM&#xff1a; <!DOCTYPE html> <html><…

算法通关村-----堆在查找和排序中的应用

数组中的第K个最大元素 问题描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。详见le…

[论文笔记]ESIM

引言 这是经典论文Enhanced LSTM for Natural Language Inference的笔记。 本篇论文文是建立在自然语言推理(Natural Language Inference,NLI)任务上的。提出了简单的通过基于LSTM的序列推理模型效果到达了当时的SOTA水平。同时基于该模型,在局部推理建模层和推理组合层使用了…

嵌入式岗位笔试面试专栏 - 岗位介绍

文章目录 一、嵌入式岗位的分类二、热门领域及公司三、发展前景四、技能要求沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将讲解嵌入岗位的工作职责 。 一、嵌入式岗位的分类 嵌入式软件工程师大致可以分为两种类型: 应用开发工程师驱动开发工程师应用工程…

ConstraintLayout约束布局

1.进行复杂页面布局时&#xff0c;最外层的根布局不要用ConstraintLayout. 示例布局&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.co…