【JAVA】建造者模式

【JAVA】建造者模式

建造者模式是一种创建型设计模式,用于将对象的构建过程与其表示分离。它可以通过一步一步地构建复杂对象,使得相同的构建过程可以创建不同的表示。

在Java中,建造者模式通常由以下几个组件组成:

  1. 产品:表示被构建的复杂对象。该类通常包含多个属性和方法。

  2. 抽象建造者:定义了构建产品的抽象接口。通常包括设置产品属性的方法和获取构建结果的方法。

  3. 具体建造者:实现了抽象建造者接口,并具体实现了构建产品的各个步骤。通常还包括获取最终构建结果的方法。

  4. 指导者:负责调用建造者的方法来构建产品,但并不知道具体的构建细节。

下面是一个示例,展示了如何使用建造者模式构建一个简单的电脑对象:

// 产品 - 电脑
class Computer {private String cpu;private String memory;private String hardDrive;public void setCpu(String cpu) {this.cpu = cpu;}public void setMemory(String memory) {this.memory = memory;}public void setHardDrive(String hardDrive) {this.hardDrive = hardDrive;}// 省略其他属性和方法
}// 抽象建造者
interface ComputerBuilder {void setCPU(String cpu);void setMemory(String memory);void setHardDrive(String hardDrive);Computer build();
}// 具体建造者
class StandardComputerBuilder implements ComputerBuilder {private Computer computer;public StandardComputerBuilder() {this.computer = new Computer();}@Overridepublic void setCPU(String cpu) {computer.setCpu(cpu);}@Overridepublic void setMemory(String memory) {computer.setMemory(memory);}@Overridepublic void setHardDrive(String hardDrive) {computer.setHardDrive(hardDrive);}@Overridepublic Computer build() {return computer;}
}// 指导者
class Director {public Computer constructStandardComputer() {ComputerBuilder builder = new StandardComputerBuilder();builder.setCPU("Intel Core i5");builder.setMemory("8GB");builder.setHardDrive("1TB");return builder.build();}
}// 示例用法
public class Main {public static void main(String[] args) {Director director = new Director();Computer computer = director.constructStandardComputer();// 使用构建好的电脑对象进行后续操作}
}

在上述示例中,我们通过抽象建造者定义了构建产品的接口。然后,具体建造者实现了该接口,并实现了构建具体产品的步骤。指导者负责调用具体建造者的方法来构建产品。

使用建造者模式的好处是可以将复杂对象的构建过程与表示分离,使得构建过程更加灵活。同时,建造者模式还能避免构建过程中产生不可变对象,使得对象的创建和表示解耦。

总结

建造者模式在Java中有许多实际应用场景。以下是一些常见的使用场景,对每个场景进行详细解释:

  1. 创建复杂对象:建造者模式适用于创建具有多个属性或参数的复杂对象。例如,创建一个包含很多配置选项的电子商务订单对象,其中包括商品、数量、价格、收货地址、付款方式等信息。通过建造者模式,可以逐步构建订单对象,并将其各个属性设置为期望的值。

  2. 对象构建的顺序不固定:当对象的构建顺序可能变化或某些属性是可选的时,建造者模式非常有用。例如,构建一个飞机对象,其中一些属性(如机翼类型、引擎类型)是可选的,而其他属性(如座位数、最大速度)是必需的。通过使用建造者模式,可以根据需要设置或省略特定的属性,而不影响对象的构建过程。

  3. 创建不同表示的对象:建造者模式允许在相同的构建过程中创建不同的表示形式。例如,在游戏开发中,可以使用建造者模式创建不同类型的角色对象,如战士、法师、射手等。每个具体的建造者可以根据角色类型的不同来设置相应的属性和行为,从而创建不同的角色对象。

  4. 隔离复杂对象的构建和使用:建造者模式可以将对象的构建过程与对象的使用分离开来,以提高代码的可维护性和灵活性。客户端只需关注最终产品的使用,而不需要了解其创建细节。这种隔离可以降低代码的耦合度,使系统更易于扩展和修改。

  5. 避免重叠构造函数:如果一个类有多个属性且可能有多种组合方式,使用构造函数可能会导致许多重叠构造函数的问题。通过使用建造者模式,可以避免这个问题,使得代码更加清晰和易于维护。建造者模式提供了一种灵活的方式来设置对象的属性,而不需要使用大量的构造函数。

总而言之,建造者模式适用于创建复杂对象、灵活控制对象构建过程、创建不同表示的对象、隔离构建和使用过程以及避免重叠构造函数的情况。它是一种强大的设计模式,在Java中被广泛应用于各种场景,使得代码更加灵活、可扩展和易于理解。

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

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

相关文章

Linux 内核动态打印调试(dev_info、 dev_dbg )

目录 前言 1 printk消息级别 2 调整内核printk打印级别 3 dev_xxx函数简介 4 配置内核使用动态打印 5 动态调试使用方法 6 动态打印调试的基本原理 🎈个人主页🎈:linux_嵌入式大师之路的博客-CSDN博客🎉🎉&…

数据库连接工具类(以mysql为例子)

依赖&#xff1a; <!-- 连接MySQL数据库的依赖&#xff0c;其他数据库网上找pom依赖替换 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency&…

xss-labs靶场通关详解

文章目录 前言level1level2level3level4level5level6level7level8level9level10level11level12level13level14level15level16level17level18level19&level20 前言 赶着假期结尾的时候&#xff0c;赶紧给自己找点任务做。现在对xss还是一知半解&#xff0c;只是了解个大概&a…

vim系列之常用命令

一.欢迎来到我的酒馆 在本章节介绍vim编辑器常用命令。 目录 一.欢迎来到我的酒馆二.vim常用命令 二.vim常用命令 2.1vim编辑器常用命令&#xff1a; i: 在光标位置处插入字符。o: 在下一行开始位置插入一行。yy: 复制光标所在的行p: 在光标位置粘贴剪切板内容。

Java seven 解读正则表达式、java方法的使用

目录 Java 正则表达式1. java.util.regex 包2. 捕获组3. 正则表达式语法4. Matcher 类的方法 Java 方法1. 定义&#xff1a;2. 优点3. 命名规则4. 方法调用5. 方法的重载6. 构造方法7. 可变参数8. finalize() 方法 Java 正则表达式 1. java.util.regex 包 Pattern 类&#xff…

自用Eclipse配置记录

喜欢用eclipse写代码&#xff0c;由于现在的eclipse配置导出的功能缺失较多。这里开一帖把本人常用的配置记录一番&#xff0c;省得再到处找。 另&#xff1a;工作空间中有个.metadata 目录保存了相关的插件及配置&#xff0c;可以复制到其他空工作间中复用配置。 设置工作空间…

Unity碰撞检测

Unity碰撞检测 前言准备材料代码使用OnCollisionEnter()进行碰撞Collider状态代码 使用OnTriggerEnter()进行碰撞Collider状态代码 区别代码OnCollisionEnter()OnTriggerEnter() 碰撞显示效果OnCollisionEnter()OnTriggerEnter() 提示结语 前言 碰撞检测可以说时学习Unity中最…

ChatGPT⼊门到精通(5):ChatGPT 和Claude区别

⼀、Claude介绍 Claude是Anthropic开发的⼀款⼈⼯智能助⼿。 官⽅⽹站&#xff1a; ⼆、Claude能做什么 它可以通过⾃然语⾔与您进⾏交互,理解您的问题并作出回复。Claude的主要功能包括: 1、问答功能 Claude可以解答⼴泛的常识问题与知识问题。⽆论是历史上的某个事件,理科…

k8s之存储篇---数据卷Volume

数据卷概述 Kubernetes Volume&#xff08;数据卷&#xff09;主要解决了如下两方面问题&#xff1a; 数据持久性&#xff1a;通常情况下&#xff0c;容器运行起来之后&#xff0c;写入到其文件系统的文件暂时性的。当容器崩溃后&#xff0c;kubelet 将会重启该容器&#xff…

群晖DSM下套件及系统网页服务器ssl证书自动更新

关键字&#xff1a; DSM ssl 证书 起因 群晖下自建服务(alist3)和系统服务在外部网络访问需要加ssl安全证书来实现基础的传输保护。 申请证书和续期手动操作都还好&#xff0c;不算太麻烦&#xff0c;但是每个应用单独证书需要复制和重启&#xff0c;再配合服务重启一套下来就…

【openGauss2.1.0实现X-Tuner进行参数调优】

openGauss2.1.0实现X-Tuner进行参数调优 一、环境说明二、参数调优步骤 openGauss2.1.0作为一款全新的开源关系型数据库&#xff0c;在性能方面具有很大的优势。通过使用X-Tuner工具&#xff0c;可以对openGauss2.1.0的参数进行优化&#xff0c;以提高其性能。 一、环境说明 华…

Javaweb入门

Spring Spring发展到今天已经形成一种开发生态圈&#xff0c;Spring提供若干个子项目&#xff0c;每个项目用于完成特定的功能。 Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 SpringBootWeb入门 需求&#xff1a;使用Spring Boot开发一个web应用&a…

软件测试面试怎样介绍自己的测试项目?会问到什么程度?

想知道面试时该怎样介绍测试项目&#xff1f;会问到什么程度&#xff1f;那就需要换位思考&#xff0c;思考HR在这个环节想知道什么。 HR在该环节普遍想获得的情报主要是下面这2个方面&#xff1a; 1&#xff09;应聘者的具体经验和技术能力&#xff0c; 2&#xff09;应聘者的…

Vector 动态数组(迭代器)

C数据结构与算法 目录 本文前驱课程 1 C自学精简教程 目录(必读) 2 Vector<T> 动态数组&#xff08;模板语法&#xff09; 本文目标 1 熟悉迭代器设计模式&#xff1b; 2 实现数组的迭代器&#xff1b; 3 基于迭代器的容器遍历&#xff1b; 迭代器语法介绍 对迭…

新版HBuilderX在uni_modules创建搜索search组件

1、创建自定义组件 my-search 新版HBuilder没有了 component 文件夹&#xff0c;但是有 uni_modules 文件夹&#xff0c;用来创建组件&#xff1a; 右键 uni_modules 文件夹&#xff0c;点击 新建uni_modules创建在弹出框&#xff0c;填写组件名字&#xff0c;例如&#xff1a…

netmap安装使用

文章目录 1、安装编译netmap2、使用netmap3、运行编写自己的代码 1、安装编译netmap github地址 git clone https://github.com/luigirizzo/netmap 1、进入目录 cd netmap-master/LINUX 2、安装编译环境 apt-get install build-essential 3、初始化配置环境 ./configure 出现这…

【linux命令讲解大全】003.掌握文件属性与权限:chattr和chgrp工具的使用

文章目录 chattr补充说明语法选项实例 chgrp补充说明语法选项参数实例 从零学 python chattr 用来改变文件属性 补充说明 chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性&#xff0c;这些属性共有以下8种模式&#xff1a; 语法 chattr …

【记录】手机QQ和电脑QQ里的emoji种类有什么差异?

版本 手机 QQ&#xff1a;V 8.9.76.12115 电脑 QQ&#xff1a;QQ9.7.15&#xff08;29157&#xff09; 偶然发现&#xff0c;有一种emoji手机上怎么找都找不到&#xff0c;一开始以为自己失忆了&#xff0c;后来发现这种emoji只在电脑上有。 接下来简单说一下找emoji差异的方式…

第 3 章 栈和队列(顺序栈,算法 3.3)

1. 背景说明&#xff1a; 若迷宫 maze 中存在从入口 start 到出口 end 的通道&#xff0c;则求得一条存放在栈中(从栈底到栈顶)&#xff0c;并返回 TRUE&#xff1b;否则返回 FALSE&#xff0c;注意&#xff0c;该解并非最优解&#xff0c; 最优解需要求得最短路径且可能并非…

C#将text文本中的单双行分开单独保存

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 文本的分割1.设定text文件的名称为02.文本导出 文本的分割 1.设定text文件的名称为0 代码如下&#xff1a; using System; using System.Collections.Generic; us…