建造者模式(或者称为生成器(构建器)模式)
一、什么是建造者模式?
将复杂对象的构建与表示进行分离,使得统一的构建过程,可以创建出不同的对象表现模式
就是将复杂对象里面的成员变量,设置不同的值,使得生成出来的对象拥有不同的属性值;
二、特点
要解决的问题:复杂对象使用不同的构建过程,产生拥有不同对象属性的对象,调用者只需要设定不同的属性值,不需要了解属性值之间是怎么构建出来对象的;
抽象建造者:抽象创建者接口
实际建造者:抽象创建者的不同实现
产品:复杂产品
指挥者:用来与调用者交互,实现通过抽象创建者生产出产品的流程
三、角色和实现
实现方式一:
- 抽象建造者
public interface CarBuilderInterface {Object builderWheel();Object builderFrame();Object builderCoreComponent();}
- 具体建造者
public class CarBuilderInterfaceImpl implements CarBuilderInterface {@Overridepublic Object builderWheel() {System.out.println("生产了一个轮子");return "返回轮子";}@Overridepublic Object builderFrame() {System.out.println("生产了一个车架");return "返回车架";}@Overridepublic Object builderCoreComponent() {System.out.println("生产了核心组件");return "返回核心组件";}
}
- 具体的产品
public class CarProduct {private String wheel;private String frame;private String coreComponent;public String getWheel() {return wheel;}public void setWheel(String wheel) {this.wheel = wheel;}public String getFrame() {return frame;}public void setFrame(String frame) {this.frame = frame;}public String getCoreComponent() {return coreComponent;}public void setCoreComponent(String coreComponent) {this.coreComponent = coreComponent;}
}
- 指挥者Director:实例化建造者,通过建造者组织具体的产品
public class CarBuilderDirector {private CarBuilderInterface carBuilderInterface;public CarBuilderDirector(CarBuilderInterface carBuilderInterface) {this.carBuilderInterface = carBuilderInterface;}public CarProduct builderCarProduct() {CarProduct carProduct = new CarProduct();carProduct.setWheel(carBuilderInterface.builderWheel().toString());carProduct.setFrame(carBuilderInterface.builderFrame().toString());carProduct.setCoreComponent(carBuilderInterface.builderCoreComponent().toString());return carProduct;}
}
- 当需要使用建造者模式进行对象构建时:
public class Client {public static void main(String[] args) {CarBuilderInterface carBuilderInterface = new CarBuilderInterfaceImpl();CarBuilderDirector carBuilderDirector = new CarBuilderDirector(carBuilderInterface);CarProduct carProduct = carBuilderDirector.builderCarProduct();System.out.println("生成了一个车:" + carProduct.getWheel() + "," + carProduct.getFrame() + "," + carProduct.getCoreComponent());}
}
实现方式二:使用静态内部类的方式实现
/*** 通过内部类的形式实现建造者模式,并且可以实现链式调用*/
public class CarBuilderExample {private String wheel;private String frame;private String coreComponent;private CarBuilderExample(String wheel, String frame, String coreComponent) {this.wheel = wheel;this.frame = frame;this.coreComponent = coreComponent;}public static class CarBuilderExampleBuilder {private String wheel;private String frame;private String coreComponent;public static CarBuilderExampleBuilder builder() {return new CarBuilderExampleBuilder();}public CarBuilderExampleBuilder wheel(String wheel) {this.wheel = wheel;return this;}public CarBuilderExampleBuilder frame(String frame) {this.frame = frame;return this;}public CarBuilderExampleBuilder coreComponent(String coreComponent) {this.coreComponent = coreComponent;return this;}public CarBuilderExample builderExample() {return new CarBuilderExample(wheel, frame, coreComponent);}}public static void main(String[] args) {CarBuilderExampleBuilder builder = CarBuilderExampleBuilder.builder();CarBuilderExample carBuilderExample = builder.wheel("轮子").frame("车架+").coreComponent("核心部件+").builderExample();System.out.println(carBuilderExample.coreComponent + carBuilderExample.frame + carBuilderExample.wheel);}}
lombok包里面的@Builder也是通过这种模式实现的
四、与工厂方法和抽象工厂之间的区别
工厂是指创建一个类型的多种实现
抽象工厂是指创建一系列类型的多种实现
相关文章:
建造者模式(或者称为生成器(构建器)模式)
一、什么是建造者模式? 将复杂对象的构建与表示进行分离,使得统一的构建过程,可以创建出不同的对象表现模式 就是将复杂对象里面的成员变量,设置不同的值,使得生成出来的对象拥有不同的属性值; 二、特点…...
【深度学习】Huber Loss详解
文章目录 1. Huber Loss 原理详解2. Pytorch 代码详解3.与 MSELoss、MAELoss 区别及各自优缺点3.1 MSELoss 均方误差损失3.2 MAELoss 平均绝对误差损失3.3 Huber Loss 4. 总结4.1 优化平滑4.2 梯度较好4.3 为什么说 MSE 是平滑的 1. Huber Loss 原理详解 Huber Loss 是一种结合…...
A5.Springboot-LLama3.2服务自动化构建(二)——Jenkins流水线构建配置初始化设置
下面我们接着上一篇文章《A4.Springboot-LLama3.2服务自动化构建(一)——构建docker镜像配置》继续往下分析,在自动化流水线构建过程当中的相关初始化设置和脚本编写。 一、首先需要先安装Jenkins 主部分请参考我前面写的一篇文章《Jenkins持续集成与交付安装配置》 二、…...
李宏毅机器学习HW1: COVID-19 Cases Prediction
Kaggle数据集和提交链接 特征选择(主要修改地方) 在sample code的基础上主要修改了Select_feat选择特征函数。 首先,因为数据集中的第一列是id,先在raw_x_train,raw_x_valid,raw_x_test中都去掉这一列。其…...
MySQL下载安装DataGrip可视化工具
目录 WinMySQL下载安装步骤MySQL配置添加环境变量 Mac下载安装配置环境变量 DataGrip可视化工具以Win为例了。Mac忘记截图了。步骤都一样 Win MySQL下载 官网: https://www.mysql.com/ 直接进下载界面: https://downloads.mysql.com/archives/installe…...
多平台下Informatica在医疗数据抽取中的应用
一、引言 1.医疗数据抽取与 Informatica 概述 1.1 医疗数据的特点与来源 1.1.1 数据特点 医疗数据具有显著的多样性特点。从数据类型来看,涵盖了结构化数据,如患者的基本信息、检验检查结果等,这些数据通常以表格形式存储,便于…...
用公网服务器实现内网穿透
首先需要一个公网服务器 下载frp 搜索github下载到frp,服务端frps/客户端frpc。。下载的时候要注意自己本地内网机的cpu版本和服务端cpu架构 我的电脑是mac M1PRO版本 下载的是:darwinarm64 比如 服务端一般是Linux(Intel 64位CPU…...
为什么mysql更改表结构时,varchar超过255会锁表
在 MySQL 中,当修改表结构并将 VARCHAR 字段的长度设置为超过 255 时,可能会出现锁表的情况。这与 MySQL 的存储引擎(主要是 InnoDB)以及表的底层存储方式相关。 原因分析 行格式变化 InnoDB 存储引擎支持多种行格式(…...
ASP.NET Core中 JWT 实现无感刷新Token
在 Web 应用开发中,用户登录状态的管理至关重要。为了避免用户频繁遇到登录过期的问题,我们可以通过实现 JWT(JSON Web Token)刷新机制来提升用户体验 推荐: 使用 Refresh Token(双 Token 机制) 1. 生成和…...
函数(函数的概念、库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、函数的声明和定义、static和extern)
一、函数的概念 •C语⾔中的函数:⼀个完成某项特定的任务的⼀⼩段代码 •函数又被翻译为子函数(更准确) •在C语⾔中我们⼀般会⻅到两类函数:库函数 ⾃定义函数 二、库函数 1 .标准库和头文件 •C语⾔的国际标准ANSIC规定了⼀…...
物联网在烟草行业的应用
物联网技术在烟草行业的应用 物联网技术在烟草行业的应用主要体现在以下几个方面: 智能制造 :物联网技术可以实现对生产过程中的关键参数进行实时监测,确保产品的质量稳定可靠。同时,通过对设备的远程维护和故障诊断,…...
第6章:Python TDD实例变量私有化探索
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
Java操作Excel导入导出——POI、Hutool、EasyExcel
目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…...
BUUCTF_Web([GYCTF2020]Ezsqli)
1.输入1 ,正常回显。 2.输入1 ,报错false,为字符型注入,单引号闭合。 原因: https://mp.csdn.net/mp_blog/creation/editor/145170456 3.尝试查询字段,回显位置,数据库,都是这个。…...
微软宣布Win11 24H2进入新阶段!设备将自动下载更新
快科技1月19日消息,微软于1月16日更新了支持文档,宣布Windows 11 24H2进入新阶段。 24H2更新于2024年10月1日发布,此前为可选升级,如今微软开始在兼容的Windows 11设备上自动下载并安装24H2版本。 微软表示:“运行Wi…...
SpringBoot:解决前后端请求跨域问题(详细教程)
文章目录 一、前言二、解决方式 2.1 使用 CrossOrigin 注解(简单方便,适用于单个或少量接口)2.2 全局配置跨域(适用于整个项目中大量接口都需要跨域的情况)2.3 使用过滤器来处理跨域(更底层的实现方式&…...
Android-V lmkd 中的那些属性值
源码基于:Android V 相关博文: Android lmkd 机制详解(一) Android lmkd 机制详解(二) Android lmkd 机制从R到T 1. 汇总 属性名说明默认值 ro.lmk.debug 启动 lmkd 的debug 模式,会打印一…...
PageHelper快速使用
依赖 <!--分页插件PageHelper--> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version> </dependency>示例 /** * 封装分页结果…...
图像处理基础(3):均值滤波器及其变种
均值滤波器可以归为低通滤波器,是一种线性滤波器,其输出为邻域模板内的像素的简单平均值,主要用于图像的模糊和降噪。 均值滤波器的概念非常的直观,使用滤波器窗口内的像素的平均灰度值代替图像中的像素值,这样的结果就…...
力扣刷题心得_JAVA
数学 > 数组 > 链表 > 字符串 > 哈希表 > 双指针 > 递归 > 栈 > 队列 > 树 //一般力扣中传入的参数和新建的对象作为返回值,都不列入空间复杂度中 //但是面试的时候要和面试官商量好,灵活定义空间复杂度 //当然最好是就在传入的对象作为返回值,(在原…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
