java设计模式-建造者(Builder)设计模式

介绍

Java的建造者(Builder)设计模式可以将产品的内部表现和产品的构建过程分离开来,这样使用同一个构建过程来构建不同内部表现的产品。

建造者设计模式涉及如下角色:

  • 产品(Product)角色:被建造的复杂对象。对象包括了多个部分,这些部分有可能有顺序关系,需要按照一定的顺序来创建。
  • 抽象构建者(Builder)角色:定义了构建产品各部分的接口,一般产品中的每个部分对应一个接口。另外,还提供返回产品的接口。抽象构建者跟具体的业务逻辑无关。
  • 具体构建者(Concrete Builder)角色:实现抽象构建者的接口,跟具体的业务逻辑相关,完成具体产品各部分的构建。如果要构建的不同产品包含的部件数量不完全相同,那也可以在抽象构建者角色中定义一套全的接口,但在具体构建者角色中对产品没有的那部分部件的构建接口实现为空。
  • 导演者(Diretor)角色:直接和客户端打交道,调用具体构建者角色创建具体的产品。

代码示例

定义一个产品:

package com.thb;

public class Packet {

	private String header;
	private String content;
	private int contentLength;
	
	public void setHeader(String header) {
		this.header = header;
	}
	
	public void setContent(String content) {
		this.content = content;
	}
	
	public void setContentLength() {
		this.contentLength = content.length();
	}
	
	public void showSummary() {
		System.out.println("header: " + this.header);
		System.out.println("content: " + this.content);
		System.out.println("contentLength: " + this.contentLength);
	}
}

定义抽象构建者:

package com.thb;

public abstract class Builder {
	
	protected Packet packet;
	
	public Builder() {
		this.packet = new Packet();
	}

	public abstract void builidHeader();
	public abstract void builidContent();
	
	public void builidContentLength() {
		this.packet.setContentLength();
	}
	
	public Packet getResult() {
		return this.packet;
	}
}

定义一个具体构建者:

package com.thb;

public class HeartBeatPacketBuilder extends Builder {

	@Override
	public void builidHeader() {
		this.packet.setHeader("heartbeat header");
	}
	
	@Override
	public void builidContent() {
		this.packet.setContent("heartbeat content");
	}

}

定义另外一个具体构建者:

package com.thb;

public class RegisterPacketBuilder extends Builder {
	
	@Override
	public void builidHeader() {
		this.packet.setHeader("register header");
	}
	
	@Override
	public void builidContent() {
		this.packet.setContent("register content");
	}

}

定义导演者:

package com.thb;

public class Director {

	private Builder builder;
	
	public Packet construct(Builder builder) {
		this.builder = builder;
		
		builder.builidHeader();
		builder.builidContent();
		builder.builidContentLength();
		
		return this.builder.getResult();
	}
}

定义主类,模拟客户端调用:

package com.thb;

public class Test1 {
		
	public static void main(String[] args) {
		Director director = new Director();
		
		Builder heartBeatPacketBuilder = new HeartBeatPacketBuilder();
		Packet heartBeatPacket = director.construct(heartBeatPacketBuilder);
		heartBeatPacket.showSummary();
		
		System.out.println("------------------------------------");
		Builder registerPacketBuilder = new RegisterPacketBuilder();
		Packet registerPacket = director.construct(registerPacketBuilder);
		registerPacket.showSummary();
	}
}

运行输出:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文精读】基于历史抽取信息的摘要抽取方法

前言 论文分享 今天分享的是来自2018ACL的长文本抽取式摘要方法论文,作者来自哈尔滨工业大学和微软,引用数369 Neural Document Summarization by Jointly Learning to Score and Select Sentences 摘要抽取通常分为两个部分,句子打分和句子…

交换机VLAN技术和实验(eNSP)

目录 一,交换机的演变 1.1,最小网络单元 1.2,中继器(物理层) 1.3,集线器(物理层) 1.4,网桥(数据链路层) 二,交换机的工作行为 2.…

使用 AntV X6 + vue 实现单线流程图

使用 AntV X6 vue 实现单线流程图 X6 是 AntV 旗下的图编辑引擎,提供了一系列开箱即用的交互组件和简单易用的节点定制能力,方便我们快速搭建 DAG 图、ER 图、流程图等应用。 官方文档 安装 yarn add antv/x61.34.6Tips: 目前 X6 有 1.x…

无涯教程-Lua - 环境安装

在Windows上安装 为Windows环境开发了一个单独的名为" SciTE"的IDE,可以从https://code.google.com/p/luaforwindows/下载部分。 运行下载的可执行文件以安装Lua IDE。 由于它是一个IDE,因此您可以使用它来创建和构建Lua代码。 如果您有兴趣在命令行模…

flutter minio

背景 前端 经常需要上传文件 图片 视频等等 到后端服务器, 如果到自己服务器 一般会有安全隐患。也不方便管理这些文件。如果要想使用一些骚操作 比如 按照前端请求生成不同分辨率的图片,那就有点不太方便了。 这里介绍以下 minio,&#xff0…

nginx入门 - 学习笔记(ing)

一、初识 1、相关概念 1)正向代理 一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标,然后代理向原始服务器转交请求并将获得内容返回给客户端。 2)反向代理…

springboot整合mybatis分页(使用pagehelper 分页插件)-- 学习若依系统

学习文档&#xff08;参考若依系统&#xff09; 若依的文档&#xff1a;http://doc.ruoyi.vip/ruoyi-vue/document/htsc.html#%E5%88%86%E9%A1%B5%E5%AE%9E%E7%8E%B0 就不从零搭建springboot项目了&#xff0c;直接在自己的项目基础上引入。 1、引入的依赖 <!-- pagehel…

【ChatGPT辅助学Rust | 基础系列 | Cargo工具】Cargo介绍及使用

文章目录 前言一&#xff0c;Cargo介绍1&#xff0c;Cargo安装2&#xff0c;创建Rust项目2&#xff0c;编译项目&#xff1a;3&#xff0c;运行项目&#xff1a;4&#xff0c;测试项目&#xff1a;5&#xff0c;更新项目的依赖&#xff1a;6&#xff0c;生成项目的文档&#xf…

xml的学习笔记

学习视频&#xff1a;093-尚硅谷-xml-什么是XML以及它的作用_哔哩哔哩_bilibili 目录 XML简介 XML的作用 XML语法 1.文档声明 2.xml注释 3.元素标签 4.xml属性 5.语法规则 1.所有xml元素都须有关闭标签(也就是闭合) 2.xml 标签对大小写敏感 3.xml必须正确的嵌套 4…

8.泛型

目录 1 基本使用 2 多个泛型 3 泛型约束 3.1 数组 3.2 extends约束 3.3 用泛型约束泛型 4 泛型接口 5 ts中的数组用的就是泛型 6 泛型类 7 常用泛型工具类型 7.1 让所有属性变为可选属性 Partial 7.2 将所有属性都变为只读属性 Readonly 7.3 从指定类…

【LeetCode】不同路劲(动态规划)

不同路劲 题目描述算法流程编程代码 链接: 不同路劲 题目描述 算法流程 编程代码 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m 1,vector<int>(n 1));dp[1][0] 1;for(int i 1;i < m;i){for(int j 1;j < n…

用于视觉跟踪的在线特征选择研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

深入理解MVVM架构模式

MVVM原理 MVVM是一种用于构建用户界面的软件架构模式&#xff0c;它的名称代表着三个组成部分&#xff1a;Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;和ViewModel&#xff08;视图模型&#xff09;。MVVM的主要目标是将应用程序的UI与其底层数据模…

认清现实重新理解游戏的本质

认清现实重新理解游戏的本质 OVERVIEW 认清现实重新理解游戏的本质现实两条小路的启发四个动机1.当前的学习任务或工作任务太艰巨2.完美主义3.对未来太过于自信/无知4.大脑小看未来的收益 四个方法1.让未来的收益足够巨大2.让未来的收益感觉就在眼前3.玩游戏有恶劣的结果4.玩游…

idea模块的pom.xml被划横线,不识别的解决办法

目录 问题&#xff1a; 解决办法&#xff1a; 1.打开设置 2. 取消勾选 3.点击确认 4.解决 问题提出&#xff1a; 写shi山的过程中&#xff0c;给模块取错名字了&#xff0c;改名的时候不知道点到了什么&#xff0c;一个模块的pom.xml变成灰色了&#xff0…

听说 Spring Bean 的创建还有一条捷径?

文章目录 1. resolveBeforeInstantiation1.1 applyBeanPostProcessorsBeforeInstantiation1.2 applyBeanPostProcessorsAfterInitialization1.3 案例 2. 源码实践2.1 切面 Bean2.2 普通 Bean 在 Spring Bean 的创建方法中&#xff0c;有如下一段代码&#xff1a; AbstractAutow…

【shell】获取ping的时延数据并分析网络情况及常用命令学习

文章目录 获取ping的时延数据并分析网络情况|、||、&、&&辨析teetailkillall 获取ping的时延数据并分析网络情况 网络情况经常让我们头疼&#xff0c;每次都需要手动在终端ping太麻烦了&#xff0c;不如写个脚本ping并将数据带上时间戳存入文件&#xff0c;然后也…

华为数通HCIA-华为VRP系统基础

什么是VRP? VRP是华为公司数据通信产品的通用操作系统平台&#xff0c;作为华为公司从低端到核心的全系列路由器、以太网交换机、业务网关等产品的软件核心引擎。 VRP提供以下功能&#xff1a; 实现统一的用户界面和管理界面 实现控制平面功能&#xff0c;并定义转发平面接口…

前端学习——Vue (Day6)

路由进阶 路由的封装抽离 //main.jsimport Vue from vue import App from ./App.vue import router from ./router/index// 路由的使用步骤 5 2 // 5个基础步骤 // 1. 下载 v3.6.5 // 2. 引入 // 3. 安装注册 Vue.use(Vue插件) // 4. 创建路由对象 // 5. 注入到new Vue中&…

无涯教程-jQuery - load( url, data, callback)方法函数

load(url&#xff0c;data&#xff0c;callback)方法从服务器加载数据&#xff0c;并将返回的HTML放入匹配的元素中。 load( url, [data], [callback] ) - 语法 [selector].load( url, [data], [callback] ) 这是此方法使用的所有参数的描述- url - 包含请求发送到…