Java设计模式-建造者模式-一次性理解透

news2024/9/22 7:28:04

在这里插入图片描述

1. 建造者模式简介

在这里插入图片描述

今天我们将研究 Java 中的建造者模式Builder 模式)。Builder 设计模式是一种创建型设计模式,也被称为生成器模式,类似于工厂模式抽象工厂模式

该模式用于创建复杂对象,允许用户创建不同类型的对象,同时保持对象的构造过程和表示分离。

2. 建造者模式的产生背景

2.1 工厂模式和抽象工厂模式的缺陷

引入建造者模式是为了解决工厂和抽象工厂设计模式在对象包含大量属性时出现的一些问题。当对象包含大量属性时,工厂和抽象工厂设计模式存在三个主要问题。

  1. 从客户端程序传递给工厂类的参数太多,这很容易出错,因为大多数情况下,参数的类型是相同的,并且从客户端很难维护参数的顺序。
  2. 一些参数可能是可选的,但在工厂模式中,我们被迫发送所有参数,并且可选参数需要以 NULL 发送。
  3. 如果对象很重并且其创建很复杂,那么所有的复杂性都将成为令人困惑的工厂类的一部分。

2.2 建造者模式诞生

我们可以通过提供具有必需参数的构造函数来解决大量参数的问题,然后提供不同的 setter 方法来设置可选参数。这种方法的问题在于,除非明确设置所有属性,否则对象状态将不一致。建造者模式通过提供一种逐步构建对象的方法并提供一种实际返回最终对象的方法,解决了大量可选参数和不一致状态的问题

3. 建造者模式原理

在这里插入图片描述
在Java中,建造者模式可以通过内部类,一个指导者类(Director)和多个建造者类(Builder)实现。
建造者(Builder)模式包含以下4个角色 :

3.1 抽象建造者类(Builder)

这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的部件对象的创建。

3.2 具体建造者类(ConcreteBuilder)

实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供一个方法,返回创建好的负责产品对象。

3.3 产品类(Product)

要创建的复杂对象,可以拥有很多属性。

3.4 指挥者类(Director)

调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建(客户端一般只需要与指挥者进行交互)。

在这里插入图片描述

4. 建造者模式的实现示例

让我们依次来构建建造者模式的四大角色:产品类、抽象建造者类(建造者接口)、具体建造者和指导者类。
在这里插入图片描述
在下面这个例子中,Product 类代表了一个复杂的对象,它有多个部分组成。Builder 接口定义了构建产品的不同部分的方法。ConcreteBuilder 是具体的建造者,实现了 Builder 接口,负责构建 Product 对象的各个部分。Director 类负责安排已经构建好的部件组装成完整的产品。客户端代码中,我们首先创建了一个建造者实例,然后通过指导者类来构建产品,最后展示构建好的产品。

4.1 产品类

class Product {
    private String partA;
    private String partB;
    private String partC;
 
    public void setPartA(String partA) {
        this.partA = partA;
    }
 
    public void setPartB(String partB) {
        this.partB = partB;
    }
 
    public void setPartC(String partC) {
        this.partC = partC;
    }
 
    public void show() {
        // 展示产品的方法
    }
}

4.2 建造者接口

interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
    Product getResult();
}

4.3 具体建造者

class ConcreteBuilder implements Builder {
    private Product product = new Product();
 
    public void buildPartA() {
        product.setPartA("构建部分A");
    }
 
    public void buildPartB() {
        product.setPartB("构建部分B");
    }
 
    public void buildPartC() {
        product.setPartC("构建部分C");
    }
 
    public Product getResult() {
        return product;
    }
}

4.4 指导者类

class Director {
    private Builder builder;
 
    public Director(Builder builder) {
        this.builder = builder;
    }
 
    public void construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

4.5 最后我们写一个客户端代码来运行

public class BuilderPatternExample {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.construct();
 
        Product product = builder.getResult();
        product.show();
    }
}

5. 建造者模式优缺点

建造者模式也不是完美的,它存在诸多有点的同时也存在诸多缺点。

5.1 建造者模式的优点

5.1.1 分离构建和表示

建造者模式可以将对象的构建过程与其表示分离开来,‌使得客户端不必知道产品内部组成的细节,‌从而实现了产品本身与产品创建过程的解耦。‌这允许同样的构建过程创建不同的表示形式。‌

5.1.2 易于扩展

通过添加新的建造器,‌可以轻松地扩展建造者模式以支持创建新的对象类型。‌这符合开闭原则,‌即对扩展开放,‌对修改关闭。‌

5.1.3 控制对象的创建过程

建造者模式允许您控制对象的构建过程,‌确保对象被正确地构建。‌通过将复杂产品的创建步骤分解在不同的方法中,‌使得创建过程更加清晰,‌也更方便使用程序来控制创建过程。‌

5.1.4 创建复杂对象

使用建造者模式可以创建具有多个组成部分的复杂对象,‌这些部分可能具有不同的属性和功能。‌

5.1.5 稳定性强

建造者模式的稳定性很好,‌通过有效的封装变化,‌可以取得比较好的稳定性。‌

5.2 建造者模式的缺点

5.2.1 增加代码量

由于建造者模式需要定义多个类和接口,‌因此在实现时可能会增加代码量。‌

5.2.2 影响性能

建造者模式的实现可能会影响性能,‌因为它需要通过多个对象来构建一个完整的对象。‌但通常该性能问题可以忽略不记!

5.2.3 类的数量增多

由于将对象的创建过程分解为多个步骤,‌并将这些步骤封装在独立的建造者类中,‌因此需要创建多个建造者类,‌从而增加了类的数量。‌

5.2.4 建造过程复杂

如果对象的创建过程过于复杂,‌可能会导致建造者类的建造过程也变得复杂,‌从而增加了代码的维护难度。‌

6. 建造者模式与工厂模式区别

建造者模式与工厂模式的区别主要体现在关注点、‌产品复杂度、‌以及使用场景上。‌

6.1 关注点不同

工厂模式主要关注的是对象的创建过程,‌它提供一个接口或抽象类来创建一系列相关的对象,‌而不关心对象的内部结构和组装过程。‌相比之下,‌建造者模式关注的是对象的内部结构和组装过程,‌通过将产品的内部表象和产品的生成过程分开,‌允许用户在不了解产品内部细节的情况下,‌通过配置和组装部件来创建复杂对象。‌

6.2 产品复杂度不同

工厂模式通常用于创建单一性质的产品,‌这些产品具有相似的结构和行为。‌而建造者模式适用于创建复杂的对象,‌这些对象由多个部件组成,‌并且这些部件的组合方式可以变化,‌从而产生不同的产品对象。‌

6.3 使用场景不同

工厂模式适用于当需要创建的对象具有相同的接口但不同的实现时,‌例如创建一个动物类,‌但具体实例可能是狗或猫等。‌建造者模式则适用于当对象结构复杂,‌由多个部分组成,‌并且这些部分的组装顺序和方式会影响最终产品的功能或表现时,‌例如构建一个软件或硬件系统,‌其中涉及多个组件的组装和配置。‌

综上所述,‌工厂模式和建造者模式虽然都是用于创建对象的设计模式,‌但它们在处理对象创建和组装的方式上有所不同,‌选择使用哪种模式取决于具体的需求和场景。‌

总结

以上就是关于建造者模式的详细介绍,你学会了吗?从建造者模式的产生背景,原理,以及代码示例、优缺点分析等多维度进行了阐述。相信通过本文的学习,大家对建造者模式有了更加深入的认识!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1997200.html

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

相关文章

【Python】PyWebIO 初体验:用 Python 写网页

目录 前言1 使用方法1.1 安装 Pywebio1.2 输出内容1.3 输入内容 2 示例程序2.1 BMI 计算器2.2 Markdown 编辑器2.3 聊天室2.4 五子棋 前言 前两天正在逛 Github,偶然看到一个很有意思的项目:PyWebIo。 这是一个 Python 第三方库,可以只用 P…

100 Exercises To Learn Rust 挑战!准备篇

公司内部的学习会非常活跃!我也参与了Rust学习会,并且一直在研究rustlings。最近,我发现了一个类似于rustlings的新教程网站:Welcome - 100 Exercises To Learn Rust。 rustlings是基于Rust的权威官方文档《The Rust Programming…

汽车免拆诊断案例 | 2010款劳斯莱斯古斯特车中央信息显示屏提示传动系统故障

故障现象  一辆2010款劳斯莱斯古斯特车,搭载N74发动机,累计行驶里程约为11万km。车主反映,起动发动机后组合仪表和中央信息显示屏均提示传动系统故障。用故障检测仪检测,发现发动机控制模块2(DME2)中存储…

SmartBI拓展包二开入门开发

前言 新接到一个项目拓展包三开的需求,没有相关经验,学习开发,本文尝试通过简单的定位以及指导,确定修改点 SmartBI帮助文档-拓展包开发 登录 http://localhost:18080/smartbi/vision/index.jsp后台配置 上传拓展包&#xff0…

MySQL和Redis的数据一致性

MySQL和Redis的数据一致性 多线程环境下的涉及读写的缓存才会存在MySQL和Redis的数据不一致问题 先删除缓存再更新数据库再延时删除缓存 线程一删除缓存线程一更新数据线程二开始查数据如果第二步线程一更新数据延时,那么线程二会重新从数据库加载数据&#xff0…

超好用的windows系统工具PowerToys

文章目录 Github地址基本介绍使用 Github地址 PowerToys 基本介绍 是windows官方好用的工具箱,包括各种工具 使用 要带上win键 此工具安装后每次运行电脑自启动,桌面没有快捷方式,只能右下角 窗口在上效果演示,会被蓝线框到…

基于GeoTools使用JavaFx进行矢量数据可视化实战

目录 前言 一、JavaFx展示原理说明 二、GeoTools的Maven依赖问题 三、引入Geotools相关的资源包 四、创建JavaFx的Canvas实例 五、JavaFx的Scene和Node的绑定 六、总结 前言 众所周知,JavaFx是Java继Swing之后的又一款用于桌面应用的开发利器。当然&#xff0…

江科大/江协科技 STM32学习笔记P22

文章目录 AD单通道&AD多通道ADC基本结构和ADC有关的库函数AD单通道AD.cmain.c连续转换,非扫描模式的AD.c AD多通道AD.cmain.c AD单通道&AD多通道 ADC基本结构 第一步,开启RCC时钟,包括ADC和GPIO的时钟,ADCCLK的分频器也需…

openvidu私有化部署

openvidu私有化部署 简介 OpenVidu 是一个允许您实施实时应用程序的平台。您可以从头开始构建全新的 OpenVidu 应用程序,但将 OpenVidu 集成到您现有的应用程序中也非常容易。 OpenVidu 基于 WebRTC 技术,允许开发您可以想象的任何类型的用例&#xf…

回归预测|基于黏菌优化LightGBM的数据回归预测Matlab程序SMA-LightGBM 多特征输入单输出

回归预测|基于黏菌优化LightGBM的数据回归预测Matlab程序SMA-LightGBM 多特征输入单输出 文章目录 前言回归预测|基于黏菌优化LightGBM的数据回归预测Matlab程序 多特征输入单输出 SMA-LightGBM 一、SMA-LightGBM模型1. **LightGBM**2. **黏菌智能优化算法(SMA&…

知识中台是什么?它如何实现高效知识管理?

引言 在信息化浪潮席卷全球的今天,企业面临的不仅是市场的激烈竞争,更是知识爆炸带来的管理挑战。如何在浩瀚的信息海洋中提炼出有价值的知识,并将其快速转化为企业的核心竞争力,成为了每个企业必须深思的问题。在此背景下&#…

二叉树的重要概念

前言: 二叉树是树形结构的一个重要类型,一般的树也可以转化成二叉树来解决问题。在数据结构的系统中,树形结构也是信息存储和遍历的重要实现,二叉树的最大特点就是一个根包含着左右子树的形式,许多具有层次关系的问题…

单元测试注解:@ContextConfiguration

ContextConfiguration注解 ContextConfiguration注解主要用于在‌Spring框架中加载和配置Spring上下文,特别是在测试场景中。 它允许开发者指定要加载的配置文件或配置类的位置,以便在运行时或测试时能够正确地构建和初始化Spring上下文。 基本用途和工…

【开源社区】Elasticsearch(ES)中空值字段 null_value 及通过exists查找非空文档

文章目录 0、声明1、问题描述2、问题剖析2.1 NULL或者空值类型有哪些2.2 案例讲解:尝试检索值为 null 的字段2.3 解决思路 3、使用 null_value 的诸多坑(避免生产事故)3.1 null_value 替换的是索引,并不会直接替换源数据3.2 不支持…

LVS(Linux Virtual Server)详解

LVS(Linux Virtual Server)是一个用于负载均衡的开源软件项目,旨在通过集群技术实现高性能、高可用的服务器系统。它运行在Linux操作系统上,并且可以利用内核级的资源来提高性能和稳定性。 思维导图 LVS的工作原理 LVS主要基于Ne…

IDEA 2022.1.4用前需知

目录 一、配置国内源 二、正确再次创建新项目方式 IDEA 2022.1.4下载地址 一、配置国内源 1、查看本地仓库地址 2、设置国内源-添加Setting.xml文件内容 3、修改目录(考虑到当前硬盘空间大小,英文目录名) 1)创建你要移动过去…

xCat部署及分发操作系统

一、环境准备 此次安装部署均在VMware虚拟机上运行。系统采用通用稳定的centos7系统,移植到其他(linux)系统应该问题不大。软件服务器的VMware虚拟机的创建部分就跳过了. 1.1服务器的配置 IP主机名配置备注192.168.11.10master4C/8G/60GXcat/DNS/DHCP/NTP/TFTP192.168.11.11n…

【超音速专利 CN109636858A】锂电池涂布图像采集标定方法、系统、设备及存储介质

申请号CN201811276578.4公开号(公开)CN109636858A申请日2018.10.30申请人(公开)广州超音速自动化科技股份有限公司(超音速人工智能科技股份有限公司)发明人(公开)赵兵锁(张); 张俊峰(张); 梁土伟 相关术语…

读零信任网络:在不可信网络中构建安全系统14流量信任

1. 流量信任 1.1. 网络流的验证和授权是零信任网络至关重要的机制 1.2. 零信任并非完全偏离已知的安全机制,传统的网络过滤机制在零信任网络中仍然扮演着重要的角色 2. 加密和认证 2.1. 加密和认证通常是紧密相关的,尽管其目的截然不同 2.1.1. 加密提…

Spring Boot - 开启log-request-details详细记录调测Controller接口

文章目录 概述实现详细日志输出1. 调整日志级别2. 示例接口3. 启用请求详细信息日志 注意事项 概述 在Spring Boot项目中,调试Controller接口的请求和响应信息可以极大地帮助开发人员排查问题并确保应用程序的安全性和性能。 实现详细日志输出 1. 调整日志级别 …