【设计模式】-建造者模式

Java建造者模式:创建复杂对象的灵活构建者

在软件开发中,我们经常遇到需要创建一个复杂对象的情况。如果使用传统的构造函数进行对象创建,可能会导致构造函数参数过多,难以管理和维护。建造者模式(Builder  Pattern)通过引入建造者对象来逐步构建复杂对象,使得对象的构建过程更加灵活、可控,同时还能提供更好的代码可读性和维护性。

一、原理

建造者模式的核心思想是将一个复杂对象的构建过程它的表示分离,使得同样的构建过程可以创建不同的表示。具体来说,建造者模式通过将对象的构建过程委派给不同的建造者类,每个建造者类都负责创建对象的一部分,并最终将这些部分组装成完整的对象。

它由四个主要的角色组成:产品类(Product)抽象建造者类(Builder)具体建造者类(ConcreteBuilder)指导者类(Director)

  • 产品类(Product):表示最终构建的对象。该类具有一些属性,可以通过设置相应的setter方法进行赋值,并且定义了一个展示产品的方法。
  • 抽象建造者类(Builder):定义了产品构建的抽象方法。包括构建不同部分的方法和获取最终产品的方法,由具体建造者类来实现。
  • 具体建造者类(ConcreteBuilder):继承自抽象建造者类,实现了具体的构建过程。包括构建不同部分和获取最终产品的方法。
  • 指导者类(Director):负责使用具体的建造者类来构建产品。通过调用具体建造者的方法来完成产品的构造,并最终返回一个完整的产品对象。

产品类

public class Product {private String partA;private String partB;private String partC;public void setPartA(String partA) {this.partA = partA;}public void setPartB(String partB) {this.partB = partB;}public void setPartC(String partC) {this.partC = partC;}public void show() {System.out.println("Product: " + partA + ", " + partB + ", " + partC);}
}

抽象建造者类

public abstract class Builder {public abstract void buildPartA();public abstract void buildPartB();public abstract void buildPartC();public abstract Product buildProduct();
}

具体建造者类

public class ConcreteBuilder extends Builder {private Product product = new Product();@Overridepublic void buildPartA() {product.setPartA("生产线1>>>-------->产品A");}@Overridepublic void buildPartB() {product.setPartB("生产线1>>>-------->产品B");}@Overridepublic void buildPartC() {product.setPartC("生产线1>>>-------->产品C");}@Overridepublic Product buildProduct() {return product;}
}

指导者类

public class Director {public Builder construct(Builder builder) {builder.buildPartA();builder.buildPartB();builder.buildPartC();return builder;}
}

测试

public class Client {public static void main(String[] args) {// 指导者Director director = new Director();// 生产线1Builder construct = director.construct(new ConcreteBuilder());Product product = construct.buildProduct();// 显示生产了什么产品product.show();}
}

运行结果如下:

 观察代码,可以发现建造者模式的流程如下:

  1. 第一步,创建指导者(Director)对象具体建造者(ConcreteBuilder)对象来开始构建创建过程。
  2. 第二步,指导者(Director)对象根据具体的建造者类完成建造过程,调用具体建造者的方法来构建产品的各个部分。也就是其方法中的builder.buildPartA();  builder.buildPartB(); builder.buildPartC();
  3. 建造者将构建好的部分返回给指导者。
  4. 指导者最终返回一个完整的产品对象,供客户端使用。

也就说,Product这个类属性的创建,不由它自身来控制,而是由具体的指导者(Director)对象来控制

那这样感觉把一个对象的创建变得复杂化了,为什么这么做呢? 这么做有什么好处和坏处呢??

优点:

  • 可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示

  • 通过增加新的具体建造者类,可以轻松扩展和改变产品的建造过程,符合开闭原则。

  • 使用建造者模式可以隐藏产品的内部细节,对客户端来说只关心如何创建对象,而不需要关心具体的构建过程。

缺点:

  • 增加了类的数量,增加了代码的复杂性

  • 对于简单的对象,使用建造者模式可能会显得繁琐。如果一个对象就那么几个字段,且其字段的使用场景比较固定,再用建造者模式就很繁琐了,还不够费劲的呢...

适用场景

  • 需要创建的对象具有复杂的内部结构,创建过程需要多个步骤。

  • 需要创建的对象的属性之间有一定的依赖关系。

  • 需要创建的对象的表示有多种方式,可以通过建造者模式灵活配置建造过程,得到不同的表示结果。

总结

建造者模式通过将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。它可以帮助我们创建复杂的对象,并保证对象的构建过程可配置和可扩展。在实际应用中,建造者模式具有较高的灵活性和可扩展性

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

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

相关文章

使用eXosip+ffmpeg、ffplay命令行实现sip客户端

文章目录 前言一、关键实现1、主要流程2、解决端口冲突(1)、出现原因(2)、解决方法 3、解析sdp(1)、定义实体(2)、解析视频(3)、解析音频 4、命令行推拉流&am…

Ctfshow web入门 XXE 模板注入篇 web373-web378 详细题解 全

CTFshow XXE web373 学习资料: (梭哈~) https://www.cnblogs.com/20175211lyz/p/11413335.html https://www.cnblogs.com/zhaijiahui/p/9147595.html https://www.cnblogs.com/r00tuser/p/7255939.html https://mp.weixin.qq.com/s?__bizMz…

stable diffusion(1): webui的本地部署(windows)

一、前言 是的,现在是202308月份了,网上已经有很多打包好的工具,或者直接进一个web就能用SD的功能,但是我们作为程序员,就应该去躺坑,这样做也是为了能够有更多自主操作的空间。 像其他AI一样&#xff0c…

【类和对象】基础知识

目录 一、类的定义 定义方式一&#xff1a;定义与声明都在类中 定义方式二&#xff1a;定义与声明分离 二、类的实例化&&类对象存储方式 类的实例化 类对象存储模式 三、this指针 一、类的定义 定义方式一&#xff1a;定义与声明都在类中 #include<iostream&…

进阶:Docker容器管理工具——Docker-Compose使用

文章目录 前言Compose大杀器编排服务 1、docker-compose安装curl方式安装增加可执行权限查看版本 2、Docker-compose.yaml命令3、 docker-compose实战4、Docker网络路由docker的跨主机网络路由**问题由来**:方案两台机分别配置路由表ip_forward配置 总结 前言 容器的管理工具&…

AI一键生成短视频

AI一键生成推文短视频 阅读时长&#xff1a;10分钟 本文内容&#xff1a; 结合开源AI&#xff0c;一键生成短视频发布到常见的某音&#xff0c;某手平台&#xff0c;狠狠赚一笔 前置知识&#xff1a; 1.基本的 python 编程知识 2.chatGPT 使用过 3.stable diffution 使用过 成果…

开关电源控制--bode图相角裕量的选择

什么是相角裕量 在Bode图中&#xff0c;相角裕量是指系统的相位裕量&#xff0c;用于评估系统的稳定性和频率响应特性。 Bode图是一种常用的频率响应图&#xff0c;将系统的增益和相位随频率变化的情况绘制出来。在Bode图中&#xff0c;相角裕量表示系统的相位与-180度&#…

Python web实战之Django的文件上传和处理详解

概要 关键词&#xff1a;Python Web开发、Django、文件上传、文件处理 今天分享一下Django的文件上传和处理。 1. 上传文件的基本原理 在开始深入讲解Django的文件上传和处理之前&#xff0c;先了解一下文件上传的基本原理。当用户选择要上传的文件后&#xff0c;该文件会被发…

Node.js-http模块服务端请求与响应操作,请求报文与响应报文

简单案例创建HTTP服务端&#xff1a; // 导入 http 模块 const http require("http"); // 创建服务对象 const server http.createServer((request, response) > {// 设置编码格式&#xff0c;解决中文乱码问题response.setHeader("content-type", &…

20天突破英语四级高频词汇——第②天

2&#xfeff;0天突破英语四级高频词汇~第2天加油(ง •_•)ง&#x1f4aa; &#x1f433;博主&#xff1a;命运之光 &#x1f308;专栏&#xff1a;英语四级高频词汇速记 &#x1f30c;博主的其他文章&#xff1a;点击进入博主的主页 目录 2&#xfeff;0天突破英语四级高…

绿盾用户使用看图软件每次都需要把图片解密之后才能打开查看,怎么才能不用这么麻烦打开就能看

环境: Win10专业版 绿盾控制台7.0 看图软件FastStone Image Viewer 问题描述: 绿盾用户使用看图软件FastStone Image Viewer每次都需要把图片解密之后才能打开查看,怎么才能不用这么麻烦打开就能看,用户说每次都需要把图片解密之后才能使用,实在是影响效率 解决方案…

0140 数据链路层2

目录 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 1.如果使用5类UTP来设计一个覆盖范围为200m的10BASE-T以太网&#xff0c;需要采用的设备是&#xff08;&#xff09; A.放大器 …

租赁类小程序定制开发|租赁管理系统源码|免押租赁系统开发

随着互联网的发展&#xff0c;小程序成为了一种重要的移动应用开发方式。租赁小程序作为其中的一种类型&#xff0c;可以为很多行业提供便利和创新。下面我们将介绍一些适合开发租赁小程序的行业。   房屋租赁行业&#xff1a;租房小程序可以帮助房东和租户快速找到合适的租赁…

Synchronized同步锁的优化方法 待完工

Synchronized 和后来出的这个lock锁的区别 在并发编程中&#xff0c;多个线程访问同一个共享资源时&#xff0c;我们必须考虑如何维护数据的原子性。在 JDK1.5 之前&#xff0c;Java 是依靠 Synchronized 关键字实现锁功能来做到这点的。Synchronized 是 JVM 实现的一种内置锁…

element表格+表单+表单验证结合运用

目录​​​​​​​ 一、结果展示 二、实现代码 一、结果展示 1、图片 2、描述 table中放form表单&#xff0c;放输入框或下拉框或多选框等&#xff1b; 点击添加按钮&#xff0c;首先验证表单&#xff0c;如果存在没填的就验证提醒&#xff0c;都填了就向下添加一行表单表…

react中hooks分享

一. HOOKS是什么 在计算机程序设计中&#xff0c;钩子一词涵盖了一系列技术&#xff0c;这些技术用来通过拦截函数调用、消息或在软件组件之间传递的事件来改变或增加操作系统、应用程序或其他软件组件的行为。处理这些被截获的函数调用、事件或消息的代码称为“hook”。 在r…

Spring Boot数据访问基础知识与JDBC简单实现

目录 Spring Boot数据访问基础知识 Spring Data ORM JDBC JPA JDBC简单实现 步骤1&#xff1a;新建Maven项目&#xff0c;添加依赖 步骤2&#xff1a;配置数据源—让程序可以访问到 步骤3&#xff1a;配置数据源—让IDEA可以访问到 步骤4&#xff1a;添加数据库和表 …

人类与机器的分类不同

分类能力也是智能的重要标识之一。通过分类&#xff0c;我们可以将事物或概念进行归类和组织&#xff0c;从而更好地理解和处理信息。分类在人类认知和智能发展中起到了重要的作用&#xff0c;它有助于我们对世界进行认知、记忆、推理和决策。在机器智能领域&#xff0c;分类同…

在WebStorm中通过live-server插件搭建Ajax运行环境

1.下载node.js 官网: https://nodejs.cn/download/ 2.配置Node.js的HTTPS 使用淘宝的镜像&#xff1a; npm config set registry https://registry.npm.taobao.org 也可以使用cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org 配置之后可以验证是否成…

Windows安装子系统Linux

Windows安装子系统(Linux ubuntu&#xff09; 安装条件步骤1.安装WSL命令2.设置Linux用户名和密码3.写个简单的.c程序看看4.如何互传文件 安装条件 Windows 10版本2004及更高的版本才能安装。 步骤 1.安装WSL命令 我们可以使用WSL来安装子系统 Linux ubuntu(默认是这个)。 …