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

文章目录

  • 【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.rhkb.cn/news/410847.html

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

相关文章

YOLO-World: Real-Time Open-Vocabulary Object Detection:实时开放词汇对象检测

YOLO系列探测器已成为高效实用的工具。然而,它们对预定义和训练的对象类别的依赖限制了它们在开放场景中的适用性。针对这一限制,我们引入了YOLO-World,这是一种创新方法,通过视觉语言建模和大规模数据集的预训练,增强…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建,发布 2. 利用 BAT 来一键部署…

Aigtek功率放大器应用领域分享:无处不在的MEMS传感器

微机电系统(MEMS,Micro-Electro-MechanicalSystem),也叫做微电子机械系统、微系统、微机械等,指尺寸在几毫米乃至更小的高科技装置。微机电系统其内部结构一般在微米甚至纳米量级。微机电系统是在微电子技术(半导体制造…

分布式基础理论——CAP理论和BASE理论

文章目录 CAP 理论BASE 理论参考资料 CAP 理论 CAP定理(CAP theorem)指出,在分布式系统中,设计读写操作时只能同时满足以下三个特性中的两个: 一致性(Consistency) : 所有节点访问同一份最新的…

ssm基于微信小程序的食堂窗口自助点餐系统源码调试讲解

1. 环境搭建 JDK 1.8:确保您的系统已安装JDK 1.8,并配置好环境变量。JDK 1.8 是目前很多Java项目仍在使用的稳定版本,适用于SSM框架。Tomcat 7:安装并配置Tomcat 7作为您的Web服务器。Tomcat 7 支持Servlet 3.0和JSP 2.2&#xf…

杰发科技AC7801——Flash模拟EEP内存(2)

1. 默认配置在1000个地址存储1000个数据 配置如下 计算地址 查看地址内容,等到打印完成 计算符合,从0-999共计1000 2. 修改配置在65536地址存储65536个数据 配置还是这个 因为传进去的地址是uint16_t,因此最大值是65536,写65536…

基于Pytorch框架的深度学习PSPnet网络动物马语义分割系统源码

第一步:准备数据 动物马分割数据,总共有328张图片,里面的像素值为0和1,所以看起来全部是黑的,不影响使用 第二步:搭建模型 psp模块的样式如下,其psp的核心重点是采用了步长不同,po…

前端:html+css:伪类画箭头(实心)

一、效果图 二、代码 html <div class"rectangle">AC/DC</div> css /* 图形 */ .rectangle {position: relative;width: 50px;height: 20px;background-color: #3498db;color: white; } .rectangle:before {content: ;position: absolute;top: 0;l…

Spring Boot Web开发实践:请求与响应参数的使用方法

主要介绍了请求响应的简单参数、实体参数、数组集合参数、日期参数、路径参数等各自的使用方法&#xff01;&#xff01;&#xff01; 文章目录 前言 Postman 简单参数 原始方式 SpringBoot方式 实体参数 数组集合参数 日期参数 路径参数 总结 前言 主要介绍了请求响应的简单参…

Tkinter Checkbutton设置了一个多选,为什么初始值都是勾选的:

代码如下&#xff1a; from tkinter import *master Tk()renyuan ["唐僧", "沙僧", "悟空", "八戒"]def r_change():rec ""ci 0for el in vars:rec el.get() "、"ci 1rec "九点" rec "离…

PHP概述-特点-应用领域-如何学习

老师建议注册使用百度文心一言&#xff1b;讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞&#xff1b;Kimi.ai - 帮你看更大的世界 等人工智能工具软件的一个到两个&#xff0c;也可下载文心一言、讯飞星火、kimi等APP软件使用&#xff0c;对于我们在读的大二学生来说有什么…

GPT-6曝光!阉割版「草莓」秋季兑现

夕小瑶科技说 原创 作者 | 海野 OpenAI的Q* 项目&#xff0c;也就是后来在网上沸沸扬扬的Strawberry草莓&#xff0c;终于定档于秋季上线。 据The Information爆料&#xff0c;作为GPT-4的下一代&#xff0c;Strawberry很惊艳&#xff1a; 拥有极强的推理和数学能力&#xf…

【人工智能 | 机器学习 | 理论篇】决策树(decision tree)

文章目录 1. 基本流程2. 划分选择2.1 信息增益2.2 增益率2.3 基尼系数 3. 剪枝处理3.1 预剪枝3.2 后剪枝 4. 连续与缺失值4.1 连续值处理4.2 缺失值处理 5. 多变量决策树 1. 基本流程 二分类任务决策树流程&#xff1a; 决策树&#xff1a;包含 1个根结点、若干个内部结点、若…

vue.js3+element-plus+typescript add,edit,del,search

vite.config.ts server: {cors: true, // 默认启用并允许任何源host: 0.0.0.0, // 这个用于启动port: 5110, // 指定启动端口open: true, //启动后是否自动打开浏览器 proxy: {/api: {target: http://localhost:8081/, //实际请求地址&#xff0c;数据库的rest APIschangeOr…

Maven Wrapper深入实战

概述 官网&#xff0c;GitHub。 Maven Wrapper&#xff0c;缩写为mvnw&#xff0c;是一个受Gradle Wrapper和Takari Wrapper启发而产生的Maven子项目&#xff0c;主要有以下三个用途&#xff1a; 让开发者电脑上无需安装Maven&#xff0c;也不用配置环境变量&#xff0c;即可…

【案例63】SSL RC4 加密套件支持检测 (Bar Mitzvah)修复方案

漏洞详情信息 漏洞名称 SSL RC4 加密套件支持检测 (Bar Mitzvah) 漏洞等级 高 漏洞描述 远程主机支持在一个或多个密码组中使用 RC4。 RC4 密码在伪随机字节流的生成中存在缺陷&#xff0c;导致引入了各种各样的小偏差&#xff0c;降低了其随机 性。 如果反复加密明文&am…

Linux下qt程序缺少中文字库,中文显示为框框

现象 Linux下qt5.9编译程序&#xff0c;运行时候界面上的中文显示一个一个的框框。 如图 原因 开发板里缺少中文字库或者qt字库环境未正常配置导致的。 解决方法一&#xff1a; 如果系统中存在中文字库&#xff0c;一般是在/usr/share/下有一个fonts文件夹 配置qt中文字库路…

【雷电防护】同为科技为国科大构建雷电防护系统

中国科学院大学&#xff08;University of Chinese Academy of Sciences&#xff09;&#xff0c;以下简称“国科大”&#xff0c;主校区位于北京市&#xff0c;是一所以科教融合为办学模式、研究生教育为办学主体的创新型大学&#xff0c;是国家“双一流”建设高校&#xff0c…

go+gin+vue入门

后端框架 1、安装go、goland 2、创建空项目 3、下载要用的包&#xff1a;命令行输入go get -u github.com/xxxx 4、安装mysql数据库&#xff0c;使用navicat创建数据库。 5、按照项目框架搭建目录、文件、代码&#xff1a;如router、model… 6、运行测试&#xff0c;go run ma…

openshift node NotReady kubelet http: TLS handshake error

文章目录 问题现象解决方法 问题现象 openshift 集群 node 节点 notready $ oc get node NAME STATUS ROLES AGE VERSION master1.ocp4.demo.com Ready control-plane,master 4d14h v1.29.76abe8a1 master2.ocp4…