当前位置: 首页 > news >正文

设计模式——建造者模式(5)

一、写在前面

  • 创建型模式
    • 单例模式
    • 工厂方法模式
    • 抽象工厂模式
    • 原型模式
    • 建造者模式
  • 结构型模式
  • 行为型模式

二、介绍

建造者模式主要在以下场景中得到应用:

  • 当需要创建的对象具有复杂的内部结构,且包含多个属性时,建造者模式可以将对象的构建和表示分离,使得客户端只需要关心最终的产品,而无需了解具体的构建步骤。
  • 当对象的创建过程涉及多个步骤,且这些步骤的顺序对最终对象有影响时,可以通过建造者模式来灵活控制构建顺序。
  • 当需要创建的产品具有多种表示,且这些表示可能由不同的属性组合而成时,可以使用建造者模式来创建不同的表示。通过定义多个具体的建造者,客户端可以选择不同的建造者来构建不同表示的对象。

三、思想

  • 建造者模式的思想是将对象的表示和构建分离,具体到代码中,就是在对象的属性还没有被赋值的时候,就可以表示出这个对象,可以手动控制这个对象什么时候赋值,可以用于属性较多的对象的创建
  • 代码如下:
//自行车类
public class Bike {private String frame;private String seat;public String getFrame() {return frame;}public void setFrame(String frame) {this.frame = frame;}public String getSeat() {return seat;}public void setSeat(String seat) {this.seat = seat;}
}public abstract class Builder {protected Bike mBike = new Bike();public abstract void buildFrame();public abstract void buildSeat();public abstract Bike createBike();
}public class MobikeBuilder extends Builder {@Overridepublic void buildFrame() {mBike.setFrame("铝合金车架");}@Overridepublic void buildSeat() {mBike.setSeat("真皮车座");}@Overridepublic Bike createBike() {return mBike;}
}
//ofo单车Builder类
public class OfoBuilder extends Builder {@Overridepublic void buildFrame() {mBike.setFrame("碳纤维车架");}@Overridepublic void buildSeat() {mBike.setSeat("橡胶车座");}@Overridepublic Bike createBike() {return mBike;}
}public class Director {private Builder mBuilder;public Director(Builder builder) {mBuilder = builder;}public Bike construct() {//核心思想!mBuilder.buildFrame();mBuilder.buildSeat();return mBuilder.createBike();}
}public class Client {public static void main(String[] args) {showBike(new OfoBuilder());showBike(new MobikeBuilder());}private static void showBike(Builder builder) {Director director = new Director(builder);Bike bike = director.construct();System.out.println(bike.getFrame());System.out.println(bike.getSeat());}
}

相关文章:

设计模式——建造者模式(5)

一、写在前面 创建型模式 单例模式工厂方法模式抽象工厂模式原型模式建造者模式 结构型模式行为型模式 二、介绍 建造者模式主要在以下场景中得到应用: 当需要创建的对象具有复杂的内部结构,且包含多个属性时,建造者模式可以将对象的构建…...

java面向对象编程--高级(二)

目录 一、内部类 1.1 成员内部类 1.1.1 静态和非静态 1.1.2 调用外部类的结构 1.2 局部内部类 1.2.1 非匿名和匿名 1.2.2 比较 1.2.3 练习 二、枚举类 2.1 枚举类讲解 2.2 代码实现 三、包装类 3.1 包装类与基本数据类型 3.2 练习 3.3 补充 四、自动生成单元测试…...

定时发送邮件

一、实验内容 在linux主机通过定时任务指定在每天12:12分定时发送邮件;邮件内容自定。 二、实验步骤 1.安装s-nali 2.编辑/etc/s-nail.rc 文件 3.配置文件 授权码获取:点击POP3/SMTP/IMAP,并且启用IMAP/SMTP服务 4、编辑任务定时器 三、…...

基于Java的免税商品优选购物商城设计与实现代码(论文+源码)_kaic

目 录 摘 要 Abstract 第一章 绪论 1.1 课题开发的背景 1.2 课题研究的意义 1.3 研究内容 第二章 系统开发关键技术 2.1 JAVA技术 2.2 MyEclipse开发环境 2.3 Tomcat服务器 2.4 Spring Boot框架 2.5 MySQL数据库 第三章 系统分析 3.1 系统可行性研究…...

解决selenium启动慢问题

新版本selenium启动缓慢,等半天才启动的问题 MacOS 暂略 Windows 解决selenium新版启动缓慢 (卡住) 的问题_webdriver.chrome()很慢-CSDN博客...

Springboot + zset + lua 实现滑动窗口

Component public class RedisRateLimiter {Autowiredprivate RedisTemplate<String, String> redisTemplate;private String luaScript() {return "redis.call(zremrangebyscore, KEYS[1], 0, tonumber(ARGV[1]) - tonumber(ARGV[2]) * 1000) " // 移除过期的…...

【深度学习】transformer为什么使用多头注意力极致?为什么不使用一个头

在现代深度学习中,Transformer 模型的多头注意力机制已被广泛应用,特别是在自然语言处理领域。最近我读到一篇有趣的博客文章,详细介绍了为什么 Transformer 采用多头注意力,而不是简单的单头注意力。文章从理论推导到代码实现,对多头注意力机制进行了深入分析。下面我为大…...

利用Excel数据合并到Word功能,官方名为“Word邮件合并”

### 利用Excel数据合并到Word功能&#xff0c;官方名为“Word邮件合并”简介 #### 引言 在日常办公场景中&#xff0c;我们经常需要将Excel中的数据批量插入到Word文档中&#xff0c;比如制作员工工资条、邀请函或是客户信息表等。传统的手工操作不仅耗时耗力&#xff0c;还容易…...

当代世界著名哲学家‌起名大师颜廷利:全球公认最厉害思想家

21世纪全球公认最厉害思想家颜廷利被认可的原因主要在于他在多个领域的深远影响和卓越贡献。 当代世界著名哲学家起名大师颜廷利教授是一位在思想、哲学、教育、易学、国学、心理学、命名学等多个领域具有深远影响的学者。他被誉为了“世界点赞第一人”&#xff0c;并且在国内外…...

Would you like conda to send this report to the core maintainers? [y/N]:

问题描述 pycharm 打开项目后&#xff0c;底部的进度条可能会一直卡住&#xff0c;提示&#xff1a;Would you like conda to send this report to the core maintainers? [y/N]: 有时候是在 Scanning installed packages&#xff0c;有时候是 Updating Python interpreter 操…...

数据结构编程实践20讲(Python版)—18哈希表

本文目录 18 哈希表(Hash Table)S1 说明特征解决问题S2 示例示例 1示例 2S3 应用应用1: LRU 缓存机制应用2:高级拼写检查器应用3:DNA 序列的 K-mer 计数往期链接 01 数组02 链表03 栈04 队列05 二叉树06 二叉搜索树07 AVL树08 红黑树09 B树10 B+树11 线段树12 树状数组13 …...

Html 标题加图标

每个网页选项卡都有一个图标&#xff1a; <meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>主页</title><link rel"icon" href"images/记事本.png&…...

机器学习探索性数据分析 (EDA)

机器学习探索性数据分析 (EDA) 探索性数据分析&#xff08;Exploratory Data Analysis, EDA&#xff09;是机器学习工作流中至关重要的一个步骤&#xff0c;通过深入分析和理解数据的结构、分布和相关性&#xff0c;EDA帮助揭示数据背后的故事&#xff0c;并为后续的建模提供有…...

【K8S系列】Kubernetes pod节点Pending或CrashLoopBackOff 问题及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;Pod 是最小的可调度单元&#xff0c;负责运行容器。当 Pod 的状态显示为 Pending 或 CrashLoopBackOff 时&#xff0c;意味着它无法成功启动或持续崩溃。本文将详细分析这两种状态的原因、排查步骤、执行后的结果及相应的解决方案。 一、Pod 状态概…...

【Redis】Zset类型常用命令

文章目录 一. Zset有序集合简介.二. 添加元素相关命令.2.1 向有序集合中添加元素(zadd) 三. 查询元素相关操作.3.1 查询有序集合中的元素个数( zcard zcount)3.2 查询指定区间内的元素(zrange zrevrange zrangebyscore)3.3 查询有序集合中指定成员的排名(zrank zrevrank )3.4 查…...

js中map,filter,find,foreach的用法介绍

js中map&#xff0c;filter&#xff0c;find&#xff0c;foreach的用法介绍 在 JavaScript 中&#xff0c;数组提供了一些常用的迭代方法&#xff0c;如 map、filter、find 和 forEach&#xff0c;这些方法允许你对数组中的每个元素进行操作&#xff0c;下面是它们的用法和区别…...

Linux 重置 root 密码

如果您在Linux系统中忘记了root密码&#xff0c;可以按照以下步骤重置&#xff1a; 重启系统。在启动时&#xff0c;当GRUB菜单出现时&#xff0c;选择要启动的内核版本&#xff0c;然后按 e 键编辑启动选项。找到以linux或linux16开头的行&#xff0c;它包含了启动内核的命令…...

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的停车场管理系统

开题报告 随着城市化进程不断加快&#xff0c;汽车保有量持续增长&#xff0c;城市停车问题日益凸显&#xff0c;传统停车场管理手段面临着诸多挑战&#xff0c;诸如管理效率低、人工成本高、信息更新滞后、收费不透明等问题。鉴于此&#xff0c;基于 Web 的智能停车场管理系统…...

博睿数据首届“观测先锋 · 2024 可观测平台创新应用案例大赛”现已启动!

大赛报名火热进行中&#xff01; 在当今这个数字化、智能化的时代&#xff0c;可观测性技术已经成为企业IT架构中不可或缺的一部分。它能够帮助企业实时监控系统的运行状态&#xff0c;及时发现并解决潜在问题&#xff0c;从而确保业务的稳定性和连续性。博睿数据一体化智能可观…...

笔记:SOME/IP-SD报文中的TTL

问&#xff1a;SOME/IP-SD报文中有几个参数名字都叫的TTL&#xff0c;请问它们有什么不同&#xff1f; 答&#xff1a;在SOME/IP Service Discovery (SOME/IP-SD)协议中&#xff0c;确实有多个与TTL&#xff08;Time-To-Live&#xff09;相关的参数&#xff0c;但它们的含义不…...

股票买卖最佳时机:LeetCode121题解

题目LeetCode121给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取…...

ssm207基于SSM的视频播放系统的设计与实现+vue(文档+源码)_kaic

第五章 系统的实现5.1 用户功能模块的实现5.1.1系统主界面用户进入本系统可查看系统信息&#xff0c;系统主界面展示如图5.1所示。图5.1网站主界面5.1.2视频详情界面用户可选择视频查看视频详情信息&#xff0c;并可进行视频播放操作&#xff0c;视频详情界面展示如图5.2所示。…...

Veo 2提示词性能瓶颈诊断:基于1726组AB测试的token敏感度热力图与阈值红线预警

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Veo 2提示词编写最佳实践总览 Veo 2 是 Google 推出的高性能视频生成模型&#xff0c;其对提示词&#xff08;prompt&#xff09;的语义精度、结构清晰度和上下文控制能力高度敏感。高质量提示词并非简单堆砌关…...

双稳健机器学习:用正交性与交叉拟合解决因果推断中的ML偏差

1. 项目概述&#xff1a;当机器学习遇见因果推断的“干扰”难题在实证研究的日常工作中&#xff0c;我们常常面临一个核心矛盾&#xff1a;我们真正关心的&#xff0c;往往只是一个或几个关键参数——比如一项政策对就业率的平均影响&#xff08;平均处理效应&#xff0c;ATE&a…...

Ubuntu经常安装软件

1、垃圾清理工具stacer sudo apt updatesudo apt install stacer apt cleanapt autocleanapt autoremove 2、类似与everything的工具Fsearcch 1sudo add-apt-repository ppa:christian-boxdoerfer/fsearch-stable 2sudo apt update 3sudo apt install fsearch (注&#xf…...

OpenRASP原理与实战:Java应用层实时防护技术详解

1. 为什么我宁愿花三天部署OpenRASP&#xff0c;也不愿再写第五个自定义WAF过滤器去年冬天&#xff0c;我在给一家做在线教育SaaS平台做安全加固时&#xff0c;连续踩了三个坑&#xff1a;第一次用NginxLua写了套SQL注入规则&#xff0c;结果学生提交的“SELECT * FROM courses…...

【C++】零基础入门 · 第 5 节:函数基础

前面四节我们写的代码都集中在 main 函数里。随着程序变复杂,所有逻辑堆在一起会越来越难维护。函数就是用来解决这个问题的——它把一段代码「打包」起来,取个名字,需要的时候调用就行。 1. 为什么需要函数 假设你需要在程序的不同地方打印一行分隔线: cout << &…...

避坑指南:Unity动态加载模型时,TriLib插件材质丢失、缩放异常的5个常见问题解决

Unity动态加载模型避坑指南&#xff1a;TriLib插件材质丢失与缩放异常的深度解决方案当你在Unity项目中尝试使用TriLib插件动态加载外部模型时&#xff0c;是否遇到过这些令人抓狂的情况&#xff1a;模型加载后材质全部变成刺眼的粉红色&#xff0c;贴图神秘消失&#xff0c;或…...

告别繁琐审核!实测AI Agent如何重塑复杂非结构化票据与合同处理流程?

摘要&#xff1a;在企业数字化转型步入深水区的2026年&#xff0c;处理复杂非结构化票据与合同已成为横亘在财务、法务部门面前的“最后一公里”难题。传统RPA因UI变动易崩溃、主流智能体因缺乏API适配而无法落地&#xff0c;导致大量业务仍依赖低效的人工操作。本文由「企服AI…...

告别手动标注!用SAM(Segment Anything)和Python脚本,5分钟批量生成你的分割数据集

5分钟批量生成分割数据集&#xff1a;SAM自动化标注全流程实战 在计算机视觉领域&#xff0c;数据标注一直是制约模型开发效率的瓶颈。传统手工标注不仅耗时费力&#xff0c;还容易引入人为误差。Meta开源的Segment Anything Model&#xff08;SAM&#xff09;彻底改变了这一局…...