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

news/2024/9/18 15:05:09/ 标签: java, 设计模式, 建造者模式

文章目录

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

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

一、概述

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

二、Builder设计模式的意图

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

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

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

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

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

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

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

java">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

java">  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);}
}

然后可以这样使用:

java">  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模式Java教程

  1. Builder设计模式在Java中的应用(DigitalOcean)
  2. Builder(Refactoring Guru)
  3. 探索Joshua Bloch在Java中的Builder设计模式(Java Magazine)

八、Builder模式的优点和权衡

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

九、源码下载

Builder模式示例代码下载

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


http://www.ppmy.cn/news/1517103.html

相关文章

【Linux篇】Linux的压缩与解压

1. 压缩格式 市面上有非常多的压缩格式: zip格式:Linux,win,MacOS,常用7zip:win常用rar:win常用tar:Linux,MacOS常用gzip:Linux,MacOS常用 如何…

C++_ch07_visual studio调试代码

C_ch07_visual studio调试代码 1.1 Break Point 断点就是程序执行到这里就会暂停,一个程序可以设置很多短点。在visual studio中只需要点击侧栏就可以设置断点。 点击左边的栏目,出现红点就是设置的断点。 另外要确保打断点的位置必须是可执行的代码&…

WordPress美化节日灯笼插件,适合春节的时候使用

源码介绍: WordPress美化节日灯笼插件,适合每年过年的时候安在网站上使用,这款插件可以备用着,一款WordPress节日灯笼美化插件,可以给网页自动加一个灯笼效果使用说明:到网站WP后台 - 插件 - 安装插件 - 上…

【学术会议征稿】第六届智能控制、测量与信号处理国际学术会议 (ICMSP 2024)

第六届智能控制、测量与信号处理国际学术会议 (ICMSP 2024) 2024 6th International Conference on Intelligent Control, Measurement and Signal Processing 文化是人类社会相对于经济和政治的精神活动和产物。传统的人类观念认为,文化是一种社会现象&#xff0…

CDGA|数据治理:统一数据标准成为核心关切

在数字化转型浪潮席卷全球的今天,数据已成为企业最宝贵的资产之一,其价值不言而喻。然而,随着数据量呈爆炸式增长,数据来源多样化、格式不一、质量参差不齐等问题日益凸显,给企业的数据管理和利用带来了前所未有的挑战…

C语言基础(二十)

链表是一种常见的数据结构,通常用来存储一系列元素,每个元素由一个节点来表示。在链表中,每个节点包含两部分:数据元素本身和指向下一个节点的指针。这种结构使得链表中的元素在内存中不是连续存储的,而是通过指针连接…

电商支付异常处理分享

时间:2024年08月28日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 音频地址:https://xima.tv/1_1qSvgv?_sonic0 希望大家帮个忙!如果大家有工作机会,希望帮小蒋内推一下&#x…

Spring Boot如何压缩Json并写入redis?

1.为什么需要压缩json? 由于业务需要,存入redis中的缓存数据过大,占用了10G的内存,内存作为重要资源,需要优化一下大对象缓存,采用gzip压缩存储,可以将 redis 的 kv 对大小缩小大约 7-8 倍&…

如何考取PostgreSQL认证证书?

PostgreSQL数据库炙手可热,国内知名的腾讯云TDSQL、阿里云PolarDB都有PostgreSQL版本的产品,还有人大金仓、华为opengauss、翰高数据库等都跟PostgreSQL有关系,所以考一个PostgreSQL认证非常有必要。要获得PostgreSQL认证,可以从以…

PTA - C语言国庆题集1

目录 7-1 阶梯电价7-2 求矩阵的最大值(设惟一)7-3 换硬币(鸡兔同笼)7-4 逆序输出一个整数的各位数字7-5 交换最小值7-6 分段函数27-7 数组中能被5整除的数的和7-8 统计字母出现的次数(hash思想)7-9 字母三角…

openEluer安装软件提示系统缺少的一些库的解决

mysql客户端相关的坑 问题:mysql: error while loading shared libraries: libncurses.so.5 解决: ln -s /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5 问题:mysql: error while loading shared libraries: libtinfo.so.5 解决…

npm阿里云制品仓库

配置 配置仓库地址,可以再在仓库指南看到 npm config set registryxxxxx#登录,帐户密码可以在仓库指南看到 npm login注意:npm>9的版本npm login目前有问题 verbose web login not supported, trying couch,暂时没试验到解决…

数据结构-递归算法-第四天

参考文献: 华为云 博客园 labuladong 的算法笔记 递归是一种编程技巧,一种解决问题的思维方式;分治算法和动态规划很大程度上是递归思想基础上的(虽然动态规划的最终版本大都不是递归了,但解题思想还是离不开递归&…

Linux环境使用docker搭建Navidrome本地个人音乐库并实现远程访问

文章目录 前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动Navidrome容器 前言 本文和大家分享一款目前在G站有11KStar的开源跨平台音乐服务器Navidrome,如何在Linux环境本地使用Docker部署,并结合cpolar内网穿透工具配置公网地址,实…

入门STM32--按键输入

上一篇博客我们介绍了如何使用GPIO配置跑马灯,根据GPIO的基本结构图,我们能够发现,他肯定不单单有输出的功能,肯定可以检测IO上的电平变化,实际上就是输入的功能。 1.按键 在大多数情况下,按键是一种简单的…

今日算法:蓝桥杯基础题之“切面条”

你好同学,我是沐爸,欢迎点赞、收藏、评论和关注!个人知乎 从今天开始,一起了解算法,每日一题,从 JavScript 的技术角度进行解答,如果你对算法也感兴趣,请多多关注哦。 问题描述 一…

15 - FFmpeg 音频混音(过滤器)

过滤器链接流程 -------- auto_aresample_0:default--[48000Hz flt:stereo]--input0| amix |default--[48000Hz flt:stereo]--auto_aresample_2:default auto_aresample_1:default--[48000Hz flt:stereo]--input1| (amix) | …

Linux 数据结构 顺序表 链表

数据结构: 1.衡量一个程序是否优秀: 1.时间复杂度: 数据量增长与程序运行时间的比例关系以函数描述称为时间渐进复杂度函数,简称时间复杂度 O(c) > O(logn) > O(n) > O(nlogn) > O(n^2) > O(n^3) > O…

一个prolog最简单推理示例

假设现在知道一些年轻人,谁喜欢谁,定义为love(x, y); 定义了一些这样的关系; 如果x喜欢y,y也喜欢x,则定义他们是一对情侣; 规则表示为: lovers(X,Y) :- love(X,Y), love(Y,X). 输入…

UniApp中的Flex布局技巧

随着移动互联网的迅速发展,越来越多的开发者开始使用跨平台技术来开发应用程序。而在跨平台开发里,uniapp是一种非常受欢迎的框架,由于使用uniapp可以快速地开发出同时支持多个平台的应用程序。在uniapp开发中,flex布局是一种非常…