【重温设计模式】构建器及其Java示例

设计模式中的构建器模式介绍

在编程的世界里,设计模式是一种让我们的代码更加优雅、可读、可维护的工具。其中,构建器模式是一种创建型模式,它提供了一种高效且灵活的方式来创建复杂对象。这种模式的主要特点是,它分离了对象的构造过程和表示方式,使得同样的构造过程可以创建不同的表示。例如,我们在创建一个复杂的OneMore对象时,可能需要设置许多属性,如果直接在构造函数中一次性设置所有属性,会使得代码难以阅读和维护。而构建器模式则可以将这个过程分解为多个步骤,每一步只负责设置一个属性,使得代码更加清晰。

public class OneMore {private String property1;private String property2;//...其他属性public static class Builder {private String property1;private String property2;//...其他属性public Builder property1(String property1) {this.property1 = property1;return this;}public Builder property2(String property2) {this.property2 = property2;return this;}//...其他属性的设置方法public OneMore build() {return new OneMore(this);}}private OneMore(Builder builder) {property1 = builder.property1;property2 = builder.property2;//...其他属性的设置}
}

在实际的开发中,构建器模式常常被用于创建复杂对象,它的运用场景主要包括:需要生成的对象具有复杂的内部结构;需要生成的对象的属性互相依赖;在对象的创建过程中需要进行特殊的处理等等。

在接下来的内容中,我们将更深入地解析构建器模式,包括其结构、工作原理以及优缺点,通过对比与其他设计模式的差异,让你更好地理解和运用构建器模式。

构建器模式的详细解析

构建器模式的核心理念是将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这样不仅可以提高代码的复用性,也使得代码更加清晰,易于维护。

构建器模式的主要组成部分有四个:Director(指导者),Builder(构建器),ConcreteBuilder(具体构建器),Product(产品)。其中,Director负责调用Builder中的方法完成复杂对象的创建;Builder是抽象接口,定义创建一个Product对象所需的各个部分的操作;ConcreteBuilder是实现Builder接口的类,实现各个部分的具体构造和装配方法,定义并明确它所创建的表示;Product则是被构建的复杂对象。

构建器模式的优点主要有两个:一是它可以将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示;二是它可以更精细地控制对象的创建过程。然而,构建器模式的主要缺点在于,由于它引入了许多新的类来实现,这会增加系统的复杂性。

通过对比,我们可以发现,构建器模式与工厂模式、原型模式等其他创建型设计模式的主要区别在于,构建器模式更注重对象构建过程的细节和步骤,而其他创建型设计模式更注重结果。

以上就是对构建器模式的详细解析,下面我们将通过一个实际的Java编程示例,展示如何在Java中实现构建器模式,同时解析示例中的关键代码,帮助读者理解和掌握构建器模式。

构建器模式的Java示例

在Java中,构建器模式的实现并不复杂,但却能大大提升代码的可读性和可维护性。

让我们通过一个实际的Java编程示例来展示如何在Java中实现构建器模式。假设我们有一个OneMore类,这个类有许多属性,每个属性都有相应的set方法。这是一个常见的Java Bean类,但是,当属性非常多的时候,我们在创建对象的时候就会面临一个问题:代码冗长、难以阅读和维护。这个时候,就需要构建器模式出场了。

public class OneMore {private String attr1;private String attr2;// ... 更多属性public OneMore setAttr1(String attr1) {this.attr1 = attr1;return this;}public OneMore setAttr2(String attr2) {this.attr2 = attr2;return this;}// ... 更多的set方法
}

为了解决这个问题,我们可以引入一个内部类Builder,将所有的set方法移到这个类中,并且每个set方法返回Builder对象本身。这样,我们就可以通过链式调用的方式来设置属性,从而大大提高代码的可读性和可维护性。

public class OneMore {private String attr1;private String attr2;// ... 更多属性private OneMore(Builder builder) {this.attr1 = builder.attr1;this.attr2 = builder.attr2;// ... 更多属性}public static class Builder {private String attr1;private String attr2;// ... 更多属性public Builder setAttr1(String attr1) {this.attr1 = attr1;return this;}public Builder setAttr2(String attr2) {this.attr2 = attr2;return this;}// ... 更多的set方法public OneMore build() {return new OneMore(this);}}
}

现在,我们可以这样来创建OneMore对象:

OneMore oneMore = new OneMore.Builder().setAttr1("value1").setAttr2("value2")// ... 更多属性.build();

通过这个示例,我们可以看到,构建器模式可以帮助我们简化复杂对象的创建过程,提高代码的可读性和可维护性,是一种非常实用的设计模式。

结语

编程的世界就像一座庞大的迷宫,各种设计模式就是我们手中的指南针,帮助我们在复杂的问题面前找到最佳的解决方案。构建器模式,作为一种创建型模式,它通过将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示,提升了代码的复用性和可维护性。

然而,正如每一枚硬币都有两面,构建器模式也并非完美无瑕。它的主要缺点在于,由于引入了许多新的类来实现,这会增加系统的复杂性,使得代码的阅读和理解难度增加。因此,在实际的开发中,我们需要根据实际情况,权衡利弊,选择最适合的设计模式。

通过本文,我希望你能对构建器模式有更深入的理解,同时也希望你能将它运用到实际的编程中,让你的代码更加优雅、可读、可维护。然而,构建器模式只是设计模式的冰山一角,还有许多其他的设计模式等待我们去探索和学习。让我们一起在编程的世界里,持续学习,持续进步。

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

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

相关文章

易点易动设备管理平台助力制造企业实现设备的智能化维修和保养管理

在制造业领域,设备的维修和保养是保障生产运行和产品质量的关键环节。然而,传统的维修和保养管理方式往往存在效率低下、难以及时发现问题等问题。为了解决这些挑战,易点易动设备管理平台应运而生。该平台利用物联网和数据分析技术&#xff0…

回归预测 | Matlab实现CPO-GRU【24年新算法】冠豪猪优化门控循环单元多变量回归预测

回归预测 | Matlab实现CPO-GRU【24年新算法】冠豪猪优化门控循环单元多变量回归预测 目录 回归预测 | Matlab实现CPO-GRU【24年新算法】冠豪猪优化门控循环单元多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-GRU【24年新算法】冠豪猪优化…

sectigo ip ssl证书有哪些

Sectigo是移交成立时间较久的CA认证机构,几十年来在全球颁发了各种各样的数字证书,例如,单域名SSL证书、多域名SSL证书、通配符SSL证书等域名SSL证书。Sectigo旗下也有一些不常见的数字证书,例如,代码签名证书、IP证书…

【设计模式】六大原则详解,每个原则提供代码示例

设计模式六大原则 目录 一、单一职责原则——SRP 1、作用2、基本要点3、举例 二、开放封闭原则——OCP 1、作用2、基本要点3、举例 三、里氏替换原则——LSP 1、作用2、基本要点3、举例 四、依赖倒置原则——DLP 1、作用2、基本要点3、举例 五、迪米特法则——LoD 1、作用2、…

C++数据结构——红黑树

一,关于红黑树 红黑树也是一种平衡二叉搜索树,但在每个节点上增加一个存储位表示节点的颜色,颜色右两种,红与黑,因此也称为红黑树。 通过对任意一条从根到叶子的路径上各个节点着色方式的限制,红黑树可以…

(2)SpringBoot学习——芋道源码

Spring Boot 的自动配置 1.概述 EmbeddedWebServerFactoryCustomizerAutoConfiguration 类 Configuration // <1.1> ConditionalOnWebApplication // <2.1> EnableConfigurationProperties(ServerProperties.class) // <3.1> public class EmbeddedWebSe…

推荐一个好用的旧版本软件安装包下载地址

最近要下载旧版本的mysql和postman&#xff0c;发现官网和其他博客里边提供的地址&#xff0c;要不都非常难找到相应的下载链接&#xff0c;要不就是提供的从别的地方复制过来的垃圾教程&#xff0c;甚至有的下载还要积分&#xff0c;反正是最后都没下载成功&#xff0c;偶然发…

nodejs基于vue奖学金助学金申请系统08ktb

高校奖助学金系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0c;…

期末成绩群发给家长

每当学期结束&#xff0c;老师们的邮箱和手机便会被成绩报告单填满。那么&#xff0c;如何高效地将成绩群发给家长呢&#xff1f; 一、邮件还是短信&#xff1f; 首先&#xff0c;选择一个合适的通讯方式是关键。邮件正式且便于附件&#xff0c;但短信更快捷。考虑到大多数家长…

windows平台使用tensorRT部署yolov5详细介绍,整个流程思路以及细节。

目录 Windows平台上使用tensorRT部署yolov5 前言&#xff1a; 环境&#xff1a; 1.为什么要部署&#xff1f; 2.那为什么部署可以解决这个问题&#xff1f;&#xff08;基于tensorRT&#xff09; 3.怎么部署&#xff08;只讨论tensorRT&#xff09; 3.0部署的流程 3.1怎…

UE4学习笔记 FPS游戏制作2 制作第一人称控制器

文章目录 章节目标前置概念Rotator与Vector&#xff1a;roll与yaw与pitch 添加按键输入蓝图结构区域1区域2区域3区域4 章节目标 本章节将实现FPS基础移动 前置概念 Rotator与Vector&#xff1a; Vector是用向量表示方向&#xff0c;UE中玩家的正前方是本地坐标系的(1,0,0)&…

【Linux】信号量

信号量 一、POSIX信号量1、信号量的原理2、信号量的概念&#xff08;1&#xff09;PV操作必须是原子操作&#xff08;2&#xff09;申请信号量失败被挂起等待 3、信号量函数4、销毁信号量5、等待信号量&#xff08;申请信号量&#xff09;6、发布信号量&#xff08;释放信号量&…

20240131在WIN10下配置whisper

20240131在WIN10下配置whisper 2024/1/31 18:25 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】800&#xffe5; 2、请正确安装好NVIDIA最新的545版本的驱动程序和CUDA。 2、安装Torch 3、配置whisper http…

仰暮计划|“从米票、肉票、糖果票到肥皂票、煤票、棉花票等,生活里头的方方面面都能用粮票买到”

口述人&#xff1a;牛翠英(女) 整理人&#xff1a;霍芝冉 口述人基本信息&#xff1a;现68岁&#xff0c;河南省安阳市北关区霍家村人&#xff0c;现居河南安阳市区。 奶奶一生辛劳&#xff0c;操持家务&#xff1b;亲眼见证了时代变迁&#xff0c;社会发展&#xff0c;…

docker笔记整理

Docker 安装 添加yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装docker yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin 启动docker systemctl start docker 查看docker状态 s…

09. 异常处理

目录 1、前言 2、常见的异常 3、异常处理try...except...finally 4、异常信息解读 5、raise 6、自定义异常 7、小结 1、前言 在编程中&#xff0c;异常&#xff08;Exception&#xff09;是程序在运行期间检测到的错误或异常状况。当程序执行过程中发生了一些无法继续执…

C languange DGEQRF 示例,link liblapack.a

1.示例源码 #include <stdio.h>int min(int m, int n){ return m<n? m:n;}void print_matrix(double* A, int m, int n, int lda) {for (int i 0; i < m; i){for (int j 0; j < n; j){//printf("%7.4f ", A[i j*lda]);printf("%7.4f, &quo…

创建表与删除表(六)

表的基本操作&#xff08;六&#xff09; 一、创建表 1.1 使用DDL语句创建表 CREATE TABLE 表名(列名 类型,列名 类型......); 示例&#xff1a; 创建一个 employees 表包含雇员 ID &#xff0c;雇员名字&#xff0c;雇员薪水。 create table employees(employee_id int,em…

从创新者到引领者:探索第四范式的AI之旅

大数据产业创新服务媒体 ——聚焦数据 改变商业 如今&#xff0c;人工智能已成为改变世界、驱动各行各业变革的核心源动力。在国内&#xff0c;有一些公司已走在前列&#xff0c;其中就包括北京第四范式智能技术股份有限公司&#xff0c;在AI这个赛道&#xff0c;他是一名创新…

Patch2QL:开源供应链漏洞挖掘和检测的新方向

背景 开源生态的上下游中&#xff0c;漏洞可能存在多种成因有渊源的其它缺陷&#xff0c;统称为“同源漏洞”&#xff0c;典型如&#xff1a; 上游代码复用缺陷。开源贡献者在实现功能相似的模块时&#xff0c;常复用已有模块代码或逻辑&#xff1b;当其中某个模块发现漏洞后…