建造者模式(创建型)

目录

一、前言

二、建造者模式

三、链式编程实现建造者模式

四、总结


一、前言

        当我们开发一个软件应用时,我们通常需要创建各种对象。有些对象是简单的,可以直接实例化,但有些对象则比较复杂,需要多个步骤才能创建完成。这时候,建造者模式就派上用场了。        

        建造者模式是一种创建型设计模式,它允许我们逐步构造一个复杂的对象,而且可以控制整个构造过程。

        建造者模式中有四个重要的角色:

产品(Product):表明需要构建的产品对象
抽象建造者(Builder):抽象出来的构建者类,用于定义创建对象所需的步骤以及创建的步骤的调用过程
具体建造者(ConcreteBuilder):抽象建造者的具体实现,对于不同的创建过程可以用不同的类进行实现
指挥者(Director):使用 Builder 的类,提供给调用方使用,调用方通过使用指挥者来获取产品

        整个建造者模式的类图:

        

二、建造者模式

        首先建立Product类:

public class Product {private String part1;private String part2;private String part3;private String part4;public void setPart1(String part1) {this.part1 = part1;}public void setPart2(String part2) {this.part2 = part2;}public void setPart3(String part3) {this.part3 = part3;}public void setPart4(String part4) {this.part4 = part4;}@Overridepublic String toString() {return "Product{" +"part1='" + part1 + '\'' +", part2='" + part2 + '\'' +", part3='" + part3 + '\'' +", part4='" + part4 + '\'' +'}';}
}

        创建抽象的Builder类:

public abstract class Builder {public abstract void buildPart1(String part1);public abstract void buildPart2(String part2);public abstract void buildPart3(String part3);public abstract void buildPart4(String part4);public abstract Product getProduct();
}

        创建具体的建造者类ConcreteBuilder:

public class ConcreteBuilder extends Builder{private Product product = new Product();@Overridepublic void buildPart1(String part1) {product.setPart1(part1);}@Overridepublic void buildPart2(String part2) {product.setPart2(part2);}@Overridepublic void buildPart3(String part3) {product.setPart3(part3);}@Overridepublic void buildPart4(String part4) {product.setPart4(part4);}@Overridepublic Product getProduct() {return product;}
}

        指挥者类Director:

public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public Product construct(String part1, String part2) {builder.buildPart1(part1);builder.buildPart2(part2);return builder.getProduct();}
}

        进行测试:

public class TestBuilder {public static void main(String[] args) {Builder builder = new ConcreteBuilder();Director director = new Director(builder);director.construct("part1", "part2");builder.buildPart3("part3");Product product = builder.getProduct();System.out.println(product);}
}

        运行结果:

        这里我是假设其中part1、part2是必须传的参数,其余两个参数非必传。

三、链式编程实现建造者模式

        链式编程中,我们只需要创建一个Product类,然后在里面创建静态的ConcreteBuilder类,并创建一个构造方法:

public class Product {private String part1;private String part2;private String part3;private String part4;public Product(ConcreteBuilder concreteBuilder) {this.part1 = concreteBuilder.part1;this.part2 = concreteBuilder.part2;this.part3 = concreteBuilder.part3;this.part4 = concreteBuilder.part4;}@Overridepublic String toString() {return "Product{" +"part1='" + part1 + '\'' +", part2='" + part2 + '\'' +", part3='" + part3 + '\'' +", part4='" + part4 + '\'' +'}';}public static class ConcreteBuilder {private String part1;private String part2;private String part3;private String part4;public ConcreteBuilder(String part1, String part2){this.part1 = part1;this.part2 = part2;}public ConcreteBuilder builderPart3(String part3) {this.part3 = part3;return this;}public ConcreteBuilder builderPart4(String part4) {this.part4 = part4;return this;}public Product build() {return new Product(this);}}}

        最后编写调用类:

public class TestBuilder {public static void main(String[] args) {Product product = new Product.ConcreteBuilder("part1", "part2").builderPart4("part4").build();System.out.println(product);}
}

        运行结果:

四、总结

        本文中的示例对象都是比较简单的,实际开发中这种简单的对象创建并不会使用到建造者模式,只有当对象比较复杂的时候才会使用到。

        实际使用的代码中,比如alibaba的Excel操作,com.alibaba.excel.write.builder就使用了建造者模式,ExcelWriterBuilder充当了具体的构建者,该类继承AbstractExcelWriterParameterBuilder。整个的产品就是一个WriteWorkbook对象。

        再比如org.springframework.web.reactive.function.client的WebClient也是使用建造者模式,使用WebClient.Builder类来构建WebClient对象。WebClient.Builder类封装了创建WebClient对象的细节,提供了一系列的方法来设置WebClient的属性,例如设置连接超时时间、设置请求头、设置代理等。最终,WebClient.Builder通过build()方法来返回一个完整的WebClient对象。使用建造者模式可以使得WebClient的构建过程更加灵活,易于使用和扩展。同时,建造者模式将对象构建的过程和具体实现分离开来,使得代码更加清晰简洁

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

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

相关文章

Leetcode刷题详解——不同路径 III

1. 题目链接:980. 不同路径 III 2. 题目描述: 在二维网格 grid 上,有 4 种类型的方格: 1 表示起始方格。且只有一个起始方格。2 表示结束方格,且只有一个结束方格。0 表示我们可以走过的空方格。-1 表示我们无法跨越的…

安卓调用手机邮箱应用发送邮件

先来看看实现效果&#xff1a; 也不过多介绍了&#xff0c;直接上代码&#xff1a; private void openMail() {Uri uri Uri.parse("mailto:" "");List<ApplicationInfo> applicationInfoList getPackageManager().getInstalledApplications(Packa…

react函数式组件props形式子向父传参

父组件中定义 子组件中触发回调传值 import { useState } from "react"; function Son(params) {const [count, setCount] useState(0);function handleClick() {console.log(params, paramsparamsparamsparamsparamsparams);params.onClick(111)setCount(count 1…

春秋云境靶场CVE-2022-32991漏洞复现(sql手工注入)

文章目录 前言一、CVE-2022-32991靶场简述二、找注入点三、CVE-2022-32991漏洞复现1、判断注入点2、爆显位个数3、爆显位位置4 、爆数据库名5、爆数据库表名7、爆数据库数据 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练…

如何禁止谷歌浏览器Google Chrome自动更新?

Windows系统&#xff1a; 按下Win R键&#xff0c;打开“运行”对话框&#xff1b;在对话框输入“services.msc”&#xff0c;并按下Enter键或者“确定”按钮。 在服务列表中找到“Google 更新服务”。 右键单击该服务&#xff0c;选择“属性”&#xff0c;将“启动类型”更改…

线性代数本质系列(二)矩阵乘法与复合线性变换,行列式,三维空间线性变换

本系列文章将从下面不同角度解析线性代数的本质&#xff0c;本文是本系列第二篇 向量究竟是什么&#xff1f; 向量的线性组合&#xff0c;基与线性相关 矩阵与线性相关 矩阵乘法与复合线性变换 三维空间中的线性变换 行列式 逆矩阵&#xff0c;列空间&#xff0c;秩与零空间 克…

使用LLama和ChatGPT为多聊天后端构建微服务

微服务架构便于创建边界明确定义的灵活独立服务。这种可扩展的方法使开发人员能够在不影响整个应用程序的情况下单独维护和完善服务。然而&#xff0c;若要充分发挥微服务架构的潜力、特别是针对基于人工智能的聊天应用程序&#xff0c;需要与最新的大语言模型&#xff08;LLM&…

Git推送本地代码到远程仓库

Git推送本地代码到远程仓库 1、首先需要安装Git&#xff0c;如果已经安装&#xff0c;请跳过。下载地址&#xff1a;https://git-for-windows.github.io/ 2、安装好git服务器后。首先找到你项目的文件夹&#xff0c;比如项目名称为Item&#xff0c;进入到这个文件夹&#xff0…

k8s-实验部署 1

1、k8s集群部署 更改所有主机名称和解析 开启四台实验主机&#xff0c;k8s1 仓库&#xff1b;k8s2 集群控制节点&#xff1b; k8s3 和k8s4集群工作节点&#xff1b; 集群环境初始化 使用k8s1作为仓库&#xff0c;将所有的镜像都保存在本地&#xff0c;不要将集群从外部走 仓库…

C 语言指针怎么理解?

今日话题&#xff0c;C 语言指针怎么理解&#xff1f;让我用更简洁的方式来表达这个内容&#xff1a;就像桌面上的快捷方式一样&#xff0c;指针也可以有多层引用。我们可以将指针比作快捷方式的图标&#xff0c;快捷方式可以指向游戏&#xff08;普通指针&#xff09;&#xf…

MyBatis研究

入门级使用 参照MyBatis官网的简介与入门部分&#xff0c;尝试使用MyBatis&#xff0c;可创建新的Maven项目&#xff0c;引入以下依赖&#xff1a; <dependencies> <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</…

CTFhub-RCE-读取源代码

源代码&#xff1a; <?php error_reporting(E_ALL); if (isset($_GET[file])) { if ( substr($_GET["file"], 0, 6) "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else {…