【Java设计模式】Builder模式:在Java中清晰构建自定义对象

news2024/9/24 5:30:56

文章目录

  • 【Java设计模式】Builder模式:在Java中清晰构建自定义对象
    • 一、概述
    • 二、Builder设计模式的意图
    • 三、Builder模式的详细解释及实际示例
    • 四、Java中Builder模式的编程示例
    • 五、Builder模式类图
    • 六、Java中何时使用Builder模式
    • 七、Builder模式的优点和权衡
    • 八、源码下载

【Java设计模式】Builder模式:在Java中清晰构建自定义对象

一、概述

在Java开发中,Builder模式是一种强大的创建型模式,它允许我们逐步构建复杂的对象。本文将详细介绍Builder模式的意图、解释、编程示例、适用场景以及实际应用。同时,还将提供示例代码的下载链接,方便读者进行学习和实践。

二、Builder设计模式的意图

Java中的Builder设计模式是一种基本的创建型模式,它允许逐步构建复杂的对象。它将复杂对象的构建与表示分离,使得相同的构建过程可以创建不同的表示。

三、Builder模式的详细解释及实际示例

  1. 实际示例
    • Java的Builder模式在对象创建涉及众多参数的场景中特别有用。
    • 想象一下,你在一家熟食店定制三明治。在这种情况下,Builder设计模式将涉及一个SandwichBuilder,它允许你指定三明治的每个组件,如面包类型、肉类、奶酪、蔬菜和调味品。你无需知道如何从头开始构建三明治,而是使用SandwichBuilder逐步添加每个所需的组件,确保你得到确切想要的三明治。这种将构建与最终产品表示分离的方式确保了相同的构建过程可以根据指定的组件生成不同类型的三明治。
  2. 通俗解释
    • 允许你创建对象的不同风格,同时避免构造函数污染。当对象可能有多种风格或创建对象涉及许多步骤时非常有用。
  3. 维基百科解释
    • Builder模式是一种对象创建软件设计模式,旨在解决伸缩构造函数反模式的问题。
    • 考虑一下伸缩构造函数反模式。在某些时候,我们都遇到过如下所示的构造函数:
public Hero(Profession profession,String name,HairType hairType,HairColor hairColor,Armor armor,Weapon weapon){
    // 值赋值
}
- 正如你所看到的,构造函数参数的数量可能会迅速变得过多,使得理解它们的排列变得困难。此外,如果将来决定添加更多选项,这个参数列表可能会继续增长。这就是所谓的伸缩构造函数反模式。

四、Java中Builder模式的编程示例

在这个Java Builder模式示例中,我们构建了具有不同属性的不同类型的Hero对象。

想象一个角色扮演游戏的角色生成器。最简单的选择是让计算机为你生成角色。但是,如果你更喜欢手动选择角色细节,如职业、性别、头发颜色等,角色创建就变成了一个逐步的过程,一旦完成所有选择就结束。

更合理的方法是使用Builder模式。首先,让我们考虑我们想要创建的Hero

public final class Hero {
    private final Profession profession;
    private final String name;
    private final HairType hairType;
    private final HairColor hairColor;
    private final Armor armor;
    private final Weapon weapon;
    private Hero(Builder builder) {
        this.profession = builder.profession;
        this.name = builder.name;
        this.hairColor = builder.hairColor;
        this.hairType = builder.hairType;
        this.weapon = builder.weapon;
        this.armor = builder.armor;
    }
}

然后我们有Builder

  public static class Builder {
    private final Profession profession;
    private final String name;
    private HairType hairType;
    private HairColor hairColor;
    private Armor armor;
    private Weapon weapon;
    public Builder(Profession profession, String name) {
        if (profession == null || name == null) {
            throw new IllegalArgumentException("profession and name can not be null");
        }
        this.profession = profession;
        this.name = name;
    }
    public Builder withHairType(HairType hairType) {
        this.hairType = hairType;
        return this;
    }
    public Builder withHairColor(HairColor hairColor) {
        this.hairColor = hairColor;
        return this;
    }
    public Builder withArmor(Armor armor) {
        this.armor = armor;
        return this;
    }
    public Builder withWeapon(Weapon weapon) {
        this.weapon = weapon;
        return this;
    }
    public Hero build() {
        return new Hero(this);
    }
}

然后可以这样使用:

  public static void main(String[] args) {
    var mage = new Hero.Builder(Profession.MAGE, "Riobard")
           .withHairColor(HairColor.BLACK)
           .withWeapon(Weapon.DAGGER)
           .build();
    LOGGER.info(mage.toString());
    var warrior = new Hero.Builder(Profession.WARRIOR, "Amberjill")
           .withHairColor(HairColor.BLOND)
           .withHairType(HairType.LONG_CURLY).withArmor(Armor.CHAIN_MAIL).withWeapon(Weapon.SWORD)
           .build();
    LOGGER.info(warrior.toString());
    var thief = new Hero.Builder(Profession.THIEF, "Desmond")
           .withHairType(HairType.BALD)
           .withWeapon(Weapon.BOW)
           .build();
    LOGGER.info(thief.toString());
}

程序输出:

16:28:06.058 [main] INFO com.iluwatar.builder.App -- This is a mage named Riobard with black hair and wielding a dagger.
16:28:06.060 [main] INFO com.iluwatar.builder.App -- This is a warrior named Amberjill with blond long curly hair wearing chain mail and wielding a sword.
16:28:06.060 [main] INFO com.iluwatar.builder.App -- This is a thief named Desmond with bald head and wielding a bow.

五、Builder模式类图

在这里插入图片描述

六、Java中何时使用Builder模式

在以下情况下使用Builder模式:

  1. Builder模式非常适合需要创建复杂对象的Java应用程序。
  2. 创建复杂对象的算法应该独立于构成对象的部分以及它们的组装方式。
  3. 构建过程必须允许构建的对象有不同的表示。
  4. 当产品需要许多步骤来创建,并且这些步骤需要按照特定顺序执行时,特别有用。

七、Builder模式的优点和权衡

  1. 优点
    • 与其他创建型模式相比,对构建过程有更多的控制。
    • 支持逐步构建对象,延迟构建步骤或递归运行步骤。
    • 可以构建需要复杂子对象组装的对象。最终产品与构成它的部分以及它们的组装过程分离。
    • 单一职责原则。你可以将复杂的构建代码与产品的业务逻辑分离。
  2. 权衡
    • 由于模式需要创建多个新类,代码的总体复杂性可能会增加。
    • 由于需要创建多个构建器对象,可能会增加内存使用。

八、源码下载

Builder模式示例代码下载

通过本文的介绍,相信大家对Java中的Builder模式有了更深入的了解。在实际开发中,合理运用Builder模式可以提高代码的可读性和可维护性,同时更好地构建复杂的对象。

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

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

相关文章

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决 一、CoreMark简介二、创建CubeMX项目2.1 选择MCU2.2 配置CPU时钟2.3 配置串口功能2.4 配置LED引脚2.5 生成CMake项目 三、基础功能支持3.1 支持记录耗时3.2 支持printf输出…

三个令人破防的真理

1、所有的人都倡导正义这是不是一件好事呢? 答案肯定是否定的,因为倡导正义不等于践行正义,很多人都倡导,那你做好事是很不容易拿到结果的,相反,你如果做坏事,你是非常容易拿到结果的。 我们的…

stm32f103c8t6 pid算法控制温度详解

目录 1. 硬件准备 必要的硬件组件: 接线示例: 2. PID算法简介 3. 软件实现 初始化和配置 PID控制算法实现 4. 调试和优化 调试步骤: 参数调整技巧: 5. 结论 在使用STM32F103C8T6微控制器进行温度控制时,PID(比例-积分-微分)算法是一种常见且有效的控制方法。…

深度学习——大模型分词

1. 前言 自从chatgpt出现,大模型的发展就进入了快车道,各种各样的大模型卷上天,作为一个在大模型时代的科研人,即使你不向前,也会被时代裹挟着向前,所以还是自己走快一点比较好,免得被后浪拍死…

黑神话悟空配置要求高吗? 配置要求介绍

《黑悟空神话》这款游戏从实机演示中可以看出对配置要求并不低,可以根据当前上市的游戏来推断出该游戏的配置要求。 1、推荐配置: 操作系统:Windows 7, Windows 8.1, Windows 10(均为64位) 处理器: Intel Core i5-6600K / AMD Ryzen 5 1600 内存: 16 …

vue后台项目打包成桌面应用程序(.exe)

目录(本项目基于vue2) 1、打包成功后的样子​ 2、开发环境 3、开发流程(serve build 基础设置 系统托盘) 4、插件下载地址 5、打包后的配置文件: 6、镜像 1、打包成功后的样子 2、开发环境 node:14.18.1 elec…

“等保”??到底保什么?简单了解信息安全等级保护

若已部署了畅云管家的企业需要做“等保”, 我们可提供注册等保所需材料 若有需求请咨询所属服务商 等级保护(简称“等保”) 简单总结:等保就是信息安全等级保护,网络安全法要求网络运营者应当按照网络安全等级保护…

告别复杂编程,低代码平台如何简化列表页多模型数据配置

在现代企业管理和信息系统建设中,随着业务复杂度的不断提升,单一数据模型往往难以满足复杂的数据展示需求。特别是在构建企业级应用或管理平台时,经常需要在一个界面上综合展示来自多个数据模型的信息,以便用户能够更全面地理解业…

OCR智能合同比对工具——快速比对合同差异点

在现代商业活动中,合同是确保交易双方权益和责任的重要法律文件。随着商业活动的复杂性增加,合同版本更新和修订变得越来越频繁。法务、采购等合同经办部门在处理合同时,往往面临着以下挑战: 1.版本一致:随着合同的不…

操作系统面试真题总结(一)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 什么是用户态和内核态 用户态和内核态是操作系统的两种运行状态。…

Redis_AOF持久化

AOF持久化 在AOF持久化的过程中,会以日志的方式记录每个redis“写”命令,并且redis服务器重启时重新执行AOF日志文件中的命令,从而达到“恢复数据”的效果 AOF故障恢复 当redis因发生故障而重启时,redis服务器会按照如下步骤根据…

演绎法推理

cp规则:给前提集合,给结论,要求推导前提推导结论。把结论化成蕴含式,里面的蕴含前件为真拿下来做补充条件,再和前提集合里面那么多条件一起推,最后推出那个结论为真。

【吊打面试官系列-Redis面试题】Redis 的数据类型?

大家好,我是锋哥。今天分享关于 【Redis 的数据类型?】面试题,希望对大家有帮助; Redis 的数据类型? 答:Redis 支持五种数据类型:string(字符串),hash&#x…

常见的服务器容器和漏洞类型汇总

常见的服务器容器和漏洞有哪些?常见的服务器容器包括KubeSphere、Tomcat、Nginx、Apache等,它们在提供便捷的服务部署和灵活的网络功能的同时,也可能存在着一定的安全风险。这些容器的漏洞可能导致数据泄露、权限被非授权访问甚至系统被完全控…

深入京东API世界:商品详情返回值的秘密

京东API世界中的商品详情返回值是一个复杂而精细的数据体系,它承载着商品的全面信息,对于商家、用户以及开发者而言,都具有极高的价值。下面,我们将深入探索京东商品详情API返回值的秘密。 基本结构概述 京东商品详情API的返回值…

【工控】线扫相机小结 第二篇

背景 上一篇中《线扫相机小结》中介绍了一些基础知识和注意事项,这一篇是对上一篇的进一步补充。 会介绍线扫相机的一些调试技巧。 如何在线调试? 我们知道,线扫相机不能像面阵相机一样实时的呈现图像,只能一行行的扫描&#x…

谷歌的搜索语法

谷歌搜索常用语法 谷歌提供了多种搜索语法,帮助用户更精确地查找所需内容。以下是一些常用语法的介绍和示例: 1. 精确匹配:使用双引号 " " 在搜索内容时,如果需要精确匹配某个词组,可以将其放在双引号内。 …

BaseCTF 高校联合新生赛 Week1

Week1 Web [Week1] HTTP BaseCTF{4248fc3d-a280-4de0-b5e6-6ff0ecaa1fca} [Week1] 喵喵喵•ﻌ• [Week1] md5绕过欸 [Week1] A Dark Room [Week1] upload 什么过滤都没有,上传一句话木马即可 [Week1] Aura 酱的礼物 卡在SSRF那里, 我想用…

SpringCloud之二注册中心(Eureka)

一、Eureka概述 Eureka是Netflix公司开源的一个服务注册与发现的中间组件。 在微服务架构系统之中,我们经常提三个角色:注册中心 (Register)、服务提供者(Provider)、服务消费者(Consumer)。 1.注册中心:服务提供者可以将服务发布到注册中心…

亚马逊aws的弹性与可扩展性解析

欢迎来到雲闪世界。可以使用各种服务和工具在 AWS 上实现可扩展性和弹性。例如,AWS Application Auto Scaling 是一种可以自动调整容量以低成本实现出色应用程序性能的服务。这允许轻松设置跨多个服务的多个资源的应用程序扩展。让我们来谈谈弹性和可扩展性之间的区…