设计模式-构建者模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS二次开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397)

目录

定义

特点

使用场景

优缺点

(1) 优点

(2) 缺点

模式结构

具体实现

(1) 方式1

(2) 方式2

实际应用


定义

造者模式(Builder Pattern):使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

特点

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

使用场景

    • 相同的方法,不同的执行顺序,产生不同的结果。
    • 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
    • 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
    • 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。

优缺点

(1) 优点
    • 封装性好,构建和表示分离。
    • 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
    • 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
(2) 缺点
    • 产品的组成部分必须相同,这限制了其使用范围。
    • 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。

模式结构

建造者(Builder)模式的主要角色如下。

    • 产品角色(Menu):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
    • 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 build()。
    • 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
    • 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

具体实现

(1) 方式1

抽象构建器和菜单项

/*** 抽象的构造器*/
public abstract class Builder {protected Menu menu = new Menu();/*** 构建复制菜单项*/abstract void buildCopyMenuItem();/*** 构建粘贴菜单项*/abstract void buildPasteMenuItem();/*** 构建剪切菜单项*/abstract void buildCutMenuItem();public Menu getMenu() {return menu;}
}/*** 手机版的菜单构建器*/
public class PhoneMenuBuilder extends Builder {@Overridevoid buildCopyMenuItem() {MenuItem menuItem = new MenuItem(1, "复制", 1);menu.setCopyMenuItem(menuItem);}@Overridevoid buildPasteMenuItem() {MenuItem menuItem = new MenuItem(2, "粘贴", 2);menu.setPasteMenuItem(menuItem);}@Overridevoid buildCutMenuItem() {MenuItem menuItem = new MenuItem(3, "剪切", 3);menu.setCutMenuItem(menuItem);}
}/*** 菜单*/
public class Menu {/*** 复制菜单项*/private MenuItem copyMenuItem;/*** 粘贴菜单项*/private MenuItem pasteMenuItem;/*** 剪贴菜单项*/private MenuItem cutMenuItem;
}

构建指挥者

/*** 指挥者*/
public class Director {private Builder builder;public Director(Builder builder){this.builder = builder;}/*** 构建菜单*/public Menu construct() {builder.buildCopyMenuItem();builder.buildPasteMenuItem();builder.buildCutMenuItem();return builder.getMenu();}}

具体使用

public class App {public static void main(String[] args) {//构建菜单Builder builder = new PhoneMenuBuilder();Director director = new Director(builder);Menu menu = director.construct();System.out.println("menu:" + menu);}
}
(2) 方式2

内部内的构建器,链式编程

/*** http请求*/
public class HttpRequest {private String url;private String contentType;private String method;private String body;public String getUrl() {return url;}public String getContentType() {return contentType;}public String getMethod() {return method;}public String getBody() {return body;}public static class Builder {private String url;private String contentType;private String method;private String body;public Builder setUrl(String url) {this.url = url;return this;}public Builder setContentType(String contentType) {this.contentType = contentType;return this;}public Builder setMethod(String method) {this.method = method;return this;}public Builder setBody(String body) {this.body = body;return this;}public HttpRequest build() {HttpRequest httpRequest = new HttpRequest();httpRequest.url = this.url;httpRequest.contentType = this.contentType;httpRequest.method = this.method;httpRequest.body = this.body;return httpRequest;}}
}

具体使用

public class App {public static void main(String[] args) {//构建请求信息HttpRequest httpRequest = new HttpRequest.Builder().setUrl("http://www.xxx.com").setContentType("application/json").setMethod("POST").setBody("123").build();System.out.println("httpRequest:" + httpRequest);}
}

实际应用

1、游戏软件中,地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分,可以使用建造者模式对其进行设计,通过不同的具体建造者创建不同类型的地图或人物。

2、复杂对象的构建,如StringBuilder、wps各组件菜单的MenuBuilder、OKHttp网络库的HttpRequestBuilder等。

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

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

相关文章

内网穿透部署流程

内网穿透 又称为NAT穿透,是一种技术手段,允许内网设备(如运行在公司内部网络、家庭网络中的服务器、智能设备等)的服务能够被外网用户访问。通常情况下,由于路由器、防火墙等设备的网络地址转换(NAT&#x…

HTML + CSS 编程规范

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 🍡编程规范 HTML CSS🍦命名规范🍦常用命名…

Jmeter BeanShell调用Java方法加密

1、添加BeanShell前置处理器 由于请求接口时,会传加密参数。加密过程会在请求之前完成,所以需要使用前置处理器中beanshell preprocessor 2、编写BeanShell脚本 ①定义一个beashell变量:phoneNum,在Beanshell中可以直接调用Jmete…

小程序出现 非 h5 平台 :key 不支持表达式 ‘xx‘ 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行代码的时候,uniapp的h5平台可以,但是微信小程序终端报如下错误: 19:37:46.620 提示:非 h5 平台 :key 不支持表达式 docheck_+index,详情参考: https://uniapp.dcloud.io/use

EFK环境搭建(基于K8S环境部署)

目录 一.环境信息二.安装nfs供应商三.安装elasticsearch四.安装kibana组件五.安装fluentd 一.环境信息 1.服务器及k8s版本 IP地址主机名称角色版本192.168.40.180master1master节点1.27192.168.40.181node1node1节点1.27192.168.40.182node2node2节点1.27 2.部署组件版本 序…

go语言并发实战——日志收集系统(三) 利用sarama包连接KafKa实现消息的生产与消费

环境的搭建 Kafka以及相关组件的下载 我们要实现今天的内容,不可避免的要进行对开发环境的配置,Kafka环境的配置比较繁琐,需要配置JDK,Scala,ZoopKeeper和Kafka,这里我们不做赘述,如果大家不知道如何配置环境&#x…

元宇宙-虚拟世界的安全风险如何应对

元宇宙(Metaverse)是一个虚拟时空间的集合,由一系列的增强现实(AR)、虚拟现实(VR)和互联网(Internet)所组成。这个虚拟时空间是一个持续存在的、由众多虚拟世界互相连接而…

MySQL常见问题汇总

1、"Host is not allowed to connect to this MySQL server" 方法1:GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION //赋予任何主机访问数据的权限 方法2:update user set host % where user root; 重启mysql 服务 2、mysqldum…

redis与etcd的对比

1.redis是一种高级的key:value存储系统,其中value支持五种数据类型: 1.1 字符串(strings) 1.2 字符串列表(lists) 1.3 字符串集合(sets) 1.4 有序字符串集合(…

STM32 HAL库F103系列之ADC实验(1)

ADC工作原理: 1、输入通道: 2、转换序列: A/D转换被组织为两组:规则组(常规转换组)和注入组(注入转换组) 规则组最多可以有16个转换,注入组最多有4个转换 规则组和注入…

Hudi-IDEA编程

项目 一、HudiSparkKafka(Scala) 配置详见【1.Scala配置】 依赖详见【1.HudiSparkKafka依赖】 1-1 构建SparkSession对象 def main(args: Array[String]): Unit {//1.构建SparkSession对象val spark: SparkSession SparkUtils.createSparkSession(…

中科亿海微-CL1656功能验证开发板

I. 引言 A. 研究背景与意义 CL1656是一款精度高、功耗低、成本低的5V单片低功耗运放,由核心互联公司研发制造,CL1656 是一个 16-bit、快速、低功耗逐次逼近型 ADC,吞吐速率高达 250 kSPS,并且内置低噪声、宽 带宽采样保持放大器。…

基于双向长短期神经网络bilstm的径流量预测,基于gru神经网络的径流量预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络bilstm的径流量预测,基于gru神经网络的径流量预测 完整代码:基于双向长短期神经网络bilstm的径流量预测,基于gru神经网络的径流量预测(代码完整,数据齐全)资源-CSDN文库 https://dow…

HarmonyOS开发实例:【分布式新闻客户端】

介绍 本篇Codelab基于栅格布局、设备管理和多端协同,实现一次开发,多端部署的分布式新闻客户端页面。主要包含以下功能: 展示新闻列表以及左右滑动切换新闻Tab。点击新闻展示新闻详情页。点击新闻详情页底部的分享按钮,发现周边…

Elasticsearch:如何将 MongoDB 数据引入 Elastic Cloud

作者:Hemendra Singh Lodhi Elastic Cloud 是由 Elastic 提供的基于云的托管服务。Elastic Cloud 允许客户在亚马逊网络服务 (AWS)、谷歌云平台 (GCP) 和微软 Azure 上部署、管理和扩展他们的 Elasticsearch 集群。 MongoDB 是一种流行的 NoSQL 文档导向数据库&am…

web安全学习笔记(10)

记一下第十四节课的内容。 一、MySQL学习 数据库基本结构:库——表——列——值 在本地打开navicat,连接数据库,新建一个liuyan库、liuyan库下新建一个member表: 在表里随意添加一些数据: 下面我们学习MySQL查询。新…

36-5 Python 编写poc基础

一、相关概念介绍 在漏洞研究和网络安全领域,常常会遇到一些特定术语和概念,例如PoC、Exploit和Payload。下面是它们的概念介绍: PoC(Proof of Concept): PoC是“Proof of Concept”的缩写,意为“概念验证”或“概念证明”。在网络安全领域,PoC通常指的是一种演示性质…

【微服务】Gateway的基本配置详解

目录 什么是gateway 基本配置详解 1. 路由配置 2. 过滤器配置 3. 路由断言 4. 过滤器工厂 什么是gateway Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个全新的微服务网关,它基于 Spring 5、Project Reactor 和 Spring Boot 2 技术栈,提供…

【Web】NewStarCTF 2022 题解(全)

目录 Week1 HTTP Head?Header! 我真的会谢 NotPHP Word-For-You Week2 Word-For-You(2 Gen) IncludeOne UnserializeOne ezAPI Week3 BabySSTI_One multiSQL IncludeTwo Maybe You Have To think More Week4 So Baby RCE BabySSTI_Two UnserializeT…

iOS知识点 --- Runtime

Objective-C (OC) 中的 Runtime 原理: Objective-C Runtime 是一套用于支持 Objective-C 动态特性的底层 C 语言 API。它为 Objective-C 提供了以下核心功能: 动态类型:在运行时确定对象的确切类型,允许在程序执行过程中进行类型…