设计模式--建造者模式

news/2024/3/29 22:37:48/文章来源:https://blog.csdn.net/m0_51406695/article/details/130332056

项目需求

  盖房需求

  (1) 需要建房子:过程为 打地基 砌墙 封顶

  (2) 房子有高正各样的,比如 平房和高楼  建房子的过程虽然都一样 但是要求不要相同的细节

传统方式

public abstract class TraditionBuild {//打地基public abstract void foundation();//砌墙public abstract void wall();//封顶public abstract void capping();public void build(){foundation();wall();capping();}
}

public class TraditionBuildSon extends TraditionBuild{@Overridepublic void foundation() {System.out.println("传统打地基");}@Overridepublic void wall() {System.out.println("传统砌墙");}@Overridepublic void capping() {System.out.println("传统封顶");}
}

传统方式解决盖房需求问题分析

(1) 容易理解 简单易操作

(2) 设计过程结构过于简单 没有设计缓存层对象 程序的扩展和维护不好 也就是说这种设计方案 把产品(成品:即房子) 和创建产品的过程(建房子的流程) 封装在一起 耦合性过强

(3) 解决方案: 将产品和建造过程进行解耦 => 建造者模式

基本介绍

(1)建造者模式(Builder Pattern)又叫 生成器模式 是一种对象构建模式 它可以将复杂对象的建造过程抽象出来(抽象方法) 使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象

(2) 建造者模式是一步一步创建一个复杂的对象 它允许用户只通过指定的复杂对象的类型和内容就可以构建它们 用户不需要知道内部的具体构建细节

建造者模式的四个角色

(1) product(产品角色): 一个具体的产品对象

(2) builder(抽象建造者): 创建一个product对象的各个部件指定的接口

(3) concreteBuilder(具体建造者): 实现接口 构建和装配各个部件

(4) director(指挥者):构建一个使用builder接口的对象 它主要用于创建一个复杂的对象 它主要隔离了客户与对象的生产过程和负责控制产品对象的生产过程

代码演示

定义产品

  

@Data
//成品
public class House {//地基private String base;//砌墙private String wall;//封顶private String capping;
}

定义抽象建造者

//抽象建造者
public abstract class HouseBuilder {protected House house = new House();//定义建造流程 抽象方法public abstract void buildBase(); //打地基public abstract void buildWall(); //砌墙public abstract void buildCapping();//封顶/*** 建造房子总合*/public House buildHouse(){return house;}}

定义具体建造者

平房

public class CommonHouse extends HouseBuilder{@Overridepublic void buildBase() {System.out.println("平房打地基5米");}@Overridepublic void buildWall() {System.out.println("平房砌墙10天");}@Overridepublic void buildCapping() {System.out.println("平房封顶");}

 高楼

public class HighHouse extends HouseBuilder{@Overridepublic void buildBase() {System.out.println("高楼打地基15米");}@Overridepublic void buildWall() {System.out.println("高楼砌墙30天");}@Overridepublic void buildCapping() {System.out.println("高楼封顶");}

定义指挥者

public class HouseDirector {HouseBuilder houseBuilder = null;/*** 构造器传入* @param houseBuilder*/public HouseDirector(HouseBuilder houseBuilder){this.houseBuilder = houseBuilder;}/*** set 传入*/public void setHouseBuilder(HouseBuilder houseBuilder){this.houseBuilder = houseBuilder;}/*** 处理建造房子的流程 由指挥者处理*/public House constructHouse(){houseBuilder.buildBase();houseBuilder.buildWall();houseBuilder.buildCapping();return houseBuilder.buildHouse();}
}

客户验收

 建造者模式在jdk应用和源码分析

StringBuilder就有应用建造者模式

进入源码查看 可以看到StringBuilder继承了AbstractStringBuilder

 进入AbstractStringBuilder查看,AbstractStringBuilder又实现了Appendable

 再进入Appendable查看

 appendable接口定义了多个append方法(抽象方法) 即appendable为抽象建造者 定义了抽象方法

再回到AbstractStringBuilder

 AbstractStringBuilder实现了appendable的接口方法 这里的AbstractStringBuilder已经是建造者 只是不能实例化

StringBuilder即充当了指挥者角色 同时又是具体的建造者 建造方法的实现是AbstractStringBuilder完成的 而StringBuilder继承了AbstractStringBuilder

建造者模式的注意事项和细节

(1) 客户端(使用程序)不必知道产品内部组成的细节 将产品本身与产品的创建过程解耦 使得相同的创建过程可以创建不同的产品对象

(2) 每一个具体建造者都相对独立 而与其他的具体建造者无关 因此可以很方便地替换具体建造者或增加新的具体建造者 用户使用不同的具体建造者即可得到不同的产品对象

(3) 可以更加精细地控制产品的创建过程 将复杂产品的创建步骤分解在不同的方法中 使得创建过程更加清晰 也更方便使用程序来控制创建过程

(4) 增加新的具体建造者无需修改原有类库的代码 指挥者类针对抽象者类编程 系统扩展方便 符合 开闭原则

(5) 建造者模式所创建的产品一般具有较多的共同点 其组成部分相似 如果产品之间的差异性很大 则不适合使用建造者模式 因此其使用范围受到一定的限制

(6) 如果产品的内部变化复杂 可能会导致需要定义很多具体建造者类来实现这种变化 导致系统变得很庞大 因此在这种情况下 要考虑是否选择建造者模式

(7) 抽闲工厂模式vs建造者模式

      抽象工厂模式实现对家族产品的创建 一个产品家族是这样的一系列产品: 具有不同分类维度的产品组合 采用抽象工厂模式不需要关心构建过程 只关心什么产品由什么工厂生产即可 而建造者模式则是要求指定的蓝天建造产品 它的主要目的是通过组装零配件而产生一个新产品

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

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

相关文章

不得不说的结构型模式-外观模式

目录 ​编辑 1. 什么是外观模式 1.1外观模式的结构: 2实际案例: 3下面是面试中关于装饰器模式的常见的问题: 3.1下面是问题的答案: 1. 什么是外观模式 Facade模式也叫外观模式, Facade模式为一组具有类似功能的类群&#xff…

opencv-python视频分析与目标跟踪

目录 光流 目标跟踪 一、光流 使用OpenCV光流分析,跟踪蚂蚁的轨迹: 代码实现: import numpy as np import cv2if __name__ __main__:cap cv2.VideoCapture(ant.mp4)# ShiTomasi 角点检测参数feature_params dict(maxCorners100,quali…

Python边缘检测之prewitt, sobel, laplace算子

文章目录 滤波算子简介具体实现测试 滤波算子简介 ndimage中提供了卷积算法,并且建立在卷积之上,提供了三种边缘检测的滤波方案:prewitt, sobel以及laplace。 在convolve中列举了一个用于边缘检测的滤波算子,统一维度后&#xf…

3.微服务项目实战---Nacos Discovery--服务治理

3.1 服务治理介绍 先来思考一个问题 通过上一章的操作,我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 ( ip ,端口)等硬编码到了代码中,这种做法存在许多问题: 一旦服务提供者地址…

精进云原生 - Dubbo 3.2 正式发布

作者:Dubbo 社区 我们非常高兴地宣布,Dubbo 3.2 已经正式发布了!这个版本带来了许多新功能和改进,这也是 Dubbo 在面对云原生化的当下的一次重要的尝试。 背景介绍 Apache Dubbo 是一款 RPC 服务开发框架,用于解决微…

虹科分享 | 如何主动保护个人信息 | 网络安全评级

网上报税和支付越来越流行,针对毫无防备的纳税人的税务欺诈也越来越频繁。以下是一些需要避免的常见网上税务骗局: 网络钓鱼诈骗 骗子利用电子邮件、短信或电话伪装成相关机构或报税软件提供商,诱骗人们提供他们的个人信息,或点击…

【云计算•云原生】1.什么是云计算?它为什么这么火?

文章目录 1.云计算基础什么是云计算云计算的分类开源软件、自由软件、免费软件 2.云计算机制云基础设施机制云管理机制云安全机制基本云架构 3.虚拟化技术服务器虚拟化服务器虚拟化技术CPU虚拟化内存虚拟化设备和I/O虚拟化存储虚拟化网络虚拟化桌面虚拟化 KVM 4.网络与存储基础…

实测有效!手把手带你将 Docker Image 体积减少 90%

Docker Image 体积越大,那部署要花的时间就越长;假如每个版本都有好几 GB,那并不是一个理想的状态;因此笔者开始动手实作,想看看到底能将 Docker Image 的体积缩小多少! 大纲 ㄧ、先初始化一个简易的 Node.js 专案 二、撰写 Dockefile,了解优化前体积有多大 三、使用 No…

通信算法之145:OFDM系统频偏(IFO/FFO)对频域信号影响

carrier frequency offset 1. 整数倍频偏IFO,频域数据相对发送端的数据出现了循环移位,子载波仍然正交。 2.小数倍频偏FFO,频域数据幅度和相位都发生变化,引入了ICI。 无频偏正常星座图 代码:待补充 读者1/2:

2023.4.23第五十次周报

目录 前言 文献阅读:基于ARIMA-WOA-LSTM模型的空气污染物预测 背景 ARIMA-WOA-LSTM模型 思路 主要贡献 积分移动平均自回归 (ARIMA) 鲸鱼优化算法 搜索超参数 CEEMDAN 结论 LSTM-Kriging 主要目标 理论猜想 问1&#xff1a…

Opencv+Python笔记(九)模板匹配

模板匹配 模板匹配常用于对象检测,且实现简单计算效率高。但如果输入图像中存在变化因素如旋转、缩放、视角变化等,模板匹配很容易失效 模板匹配原理: 1.匹配方式为模板 (a * b) 在原图像 (m * n) 上滑动 使用参数method中指定的方法&#…

IJKPLAYER源码分析-常用API

前言 本文简要介绍IJKPLAYER的几个常用API,以API使用的角度,来审视其内部运作原理。这里以iOS端直播API调用切入。 调用流程 init 创建播放器实例后,会先调用init方法进行初始化: - (IJKFFMediaPlayer *)init {self [super ini…

ChatGLM-6B 中文对话模型复现、调用模块、微调及部署实现(更新中)

ChatGLM-6B-PT 一、前言 近期,清华开源了其中文对话大模型的小参数量版本 ChatGLM-6B(GitHub地址:https://github.com/THUDM/ChatGLM-6B)。其不仅可以单卡部署在个人电脑上,甚至 INT4 量化还可以最低部署到 6G 显存的…

SLAM论文速递【SLAM—— RDS-SLAM:基于语义分割方法的实时动态SLAM—4.24(1)

论文信息 题目: RDS-SLAM:Real-Time Dynamic SLAM Using Semantic Segmentation Methods RDS-SLAM:基于语义分割方法的实时动态SLAM论文地址: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9318990发表期刊: IEEE Access ( Volum…

新手必看!ChatGPT常见问题总整理,你遇到了几个?

随着ChatGPT火爆全球,使用人数以指数型成长,许多使用上的问题呈现在网路上。 今天这篇文章会用实作的方式带大家了解ChatGPT有哪些常见问题,以此减少踩坑的机会。 并用简单的示例让大家感受GPT-3.5与GPT-4的能力差异,希望对大家有所帮助。 大家会有这些问题,其实就是希望…

SequoiaDB分布式数据库2023.3月刊

本月看点速览 赋能行业,参编《分布式数据库金融应用发展报告》 脱颖而出,入选2022专精特新黑马大赛年度十强 激烈角逐,成功晋级全国信创优秀解决方案决赛 新穗新彩,多家权威媒体走进巨杉 青杉计划2023持续进行,一起…

从源码全面解析 ArrayBlockingQueue 的来龙去脉

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,阿里云专家博主📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

安卓手机(微信小程序)抓蓝牙通信数据包

前言 因为公司需要......所以我就弄了一下,参考了很多别人的文章。 成果:它可以抓取微信小程序、安卓APP的蓝牙数据通信包。 开始 我是小米手机,所以我以我自己手机为例 通信过程操作 第一步 打开开发者选项,打开蓝牙调试日志和蓝牙数据包日志开关(如果两者只有其中…

MAVEN环境变量配置(Windows 11)

1、直接在搜索框中搜:编辑系统环境变量 2、点击环境变量 3、 在系统变量里面新建系统变量 变量名:MAVEN_HOME 变量值:路径一定要写到maven的bin目录下 以下这种写法是错误的 4、新建系统变量完成 5、 往下滑 找到path,可以双击…

什么是gpt一4-如何用上gpt-4

怎么使用gpt-4 目前GPT-4还未正式发布或公开,因此也没有详细的对接说明。但是我们可以根据GPT-4的前身GPT-3的应用经验,以及GPT-4的预期功能推测一些可能的使用步骤: 选择适合的GPT-4实现技术:GPT-4可能有不同的实现技术&#xff…