设计模式(三)建造者模式

相关文章
设计模式系列

1.建造者模式简介

定义

建造者模式(builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

简介

建造者模式(builder)是创建一个复杂对象的创建型模式,将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离开来。
例如我们要DIY一个台式机电脑,我们找到DIY商家,我们可以要求这台电脑的cpu或者主板或者其他的部件都是什么牌子的什么配置的,这些部件是我们可以根据我们的需求来变化的,但是这些部件组装成电脑的过程是一样的,我们不需要知道这些部件是怎样组装成电脑的,我们只需要提供部件的牌子和配置就可以了。对于这种情况我们就可以采用建造者模式,将部件和组装过程分离,使得构建过程和部件都可以自由拓展,两者之间的耦合也降到最低。

建造者模式结构图

  • Dirextor: 指挥者类,用于统一组装流程
  • Builder:抽象Builder类,规范产品的组建,一般是由子类实现。
  • ConcreteBulider: 抽象Builder类的实现类,实现抽象Builder类定义的所有方法,并且返回一个组建好的对象
  • Product: 产品类

2.建造者模式简单实现

这里我们就用DIY组装电脑的例子来实现一下建造者模式。

创建产品类

我要组装一台电脑,电脑被抽象为Computer类,它有三个部件:CPU 、主板和内存。并在里面提供了三个方法分别用来设置CPU 、主板和内存:

public class Computer {private String mCpu;private String mMainboard;private String mRam;public void setmCpu(String mCpu) {this.mCpu = mCpu;}public void setmMainboard(String mMainboard) {this.mMainboard = mMainboard;}public void setmRam(String mRam) {this.mRam = mRam;}
}

创建Builder类规范产品的组建

商家组装电脑有一套组装方法的模版,就是一个抽象的Builder类,里面提供了安装CPU、主板和内存的方法,以及组装成电脑的create方法:

public abstract class Builder {public abstract void buildCpu(String cpu);public abstract void buildMainboard(String mainboard);public abstract void buildRam(String ram);public abstract Computer create();
}

商家实现了抽象的Builder类,MoonComputerBuilder类用于组装电脑:

public class MoonComputerBuilder extends Builder {private Computer mComputer = new Computer();@Overridepublic void buildCpu(String cpu) {mComputer.setmCpu(cpu);}@Overridepublic void buildMainboard(String mainboard) {mComputer.setmMainboard(mainboard);}@Overridepublic void buildRam(String ram) {mComputer.setmRam(ram);}@Overridepublic Computer create() {return mComputer;}
}

用Dirextor指挥者类来统一组装过程

商家的指挥者类用来规范组装电脑的流程规范,先安装主板,再安装CPU,最后安装内存并组装成电脑:

public class Direcror {Builder mBuild=null;public Direcror(Builder build){this.mBuild=build;}public Computer CreateComputer(String cpu,String mainboard,String ram){//规范建造流程this.mBuild.buildMainboard(mainboard);this.mBuild.buildCpu(cpu);this.mBuild.buildRam(ram);return mBuild.create();}
}

客户端调用指挥者类

最后商家用指挥者类组装电脑。我们只需要提供我们想要的CPU,主板和内存就可以了,至于商家怎样组装的电脑我们无需知道。

public class CreatComputer {public static void main(String[]args){Builder mBuilder=new MoonComputerBuilder();Direcror mDirecror=new Direcror(mBuilder);//组装电脑mDirecror.CreateComputer("i7-6700","华擎玩家至尊","三星DDR4");}
}

3.使用建造者模式的场景和优缺点

使用场景
  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 相同的方法,不同的执行顺序,产生不同的事件结果时。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
  • 创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
优缺点
优点:
  • 使用建造者模式可以使客户端不必知道产品内部组成的细节。
  • 具体的建造者类之间是相互独立的,容易扩展。
  • 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
缺点:
  • 产生多余的Build对象以及Dirextor类。

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

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

相关文章

2024图像处理分析与信息工程国际学术会议(IACIPIE2024)

2024图像处理分析与信息工程国际学术会议(IACIPIE2024) 会议简介 2024图像处理分析与信息工程国际学术会议(IACIPIE2024)将在中国长沙举行。 IACIPIE2024是一个年度会议,探讨图像处理分析和信息工程相关领域的发展和影响,旨在介…

状态机-----

1.原理 同步的意思就是状态的跳转都是在时钟的作用下跳转的,有限是指状态机中状态的个数是有限的。两种状态机的共同点都是状态的跳转只和输入有关,区别就是如果最后的输出只和当前状态有关而与输入无关,则是moore型状态机。如果最后的输出不…

STM32学习3 寄存器映射和GPIO寄存器编程

STM32学习3 寄存器映射和GPIO寄存器编程 一、STM32外设内存空间1. 内存空间划分2. 区域功能说明(1)block0(2)block1(3)block2(4)block3~4(5)block5&#xff0…

猫咪挑食不吃猫粮怎么办?适口性高、可以改善猫咪挑食的主食冻干分享

猫咪挑食不吃猫粮怎么办?在现今社会,养猫的人越来越多,大家都把自家的小猫当作宝贝来宠爱。但宠爱过度有时也会导致猫咪养成挑食的坏习惯。面对这一问题,我们应该如何解决呢?今天,我要分享一个既能确保猫咪…

Adobe Illustrator 2022 for Mac/Win:设计的新篇章

在数字艺术和设计领域,Adobe Illustrator一直以其强大的功能和高效的工具受到专业人士的青睐。随着2022年的到来,Adobe Illustrator 2022(简称AI 2022)的发布无疑为设计师们带来了新的希望和期待。 一、强大的新功能 AI 2022引入…

什么是小红书品牌笔记,如何做好达人投放?

认认真真撰写了小红书品牌笔记,从各个方面确保了笔记的优质程度,却没能产生爆文。这很可能是笔记与用户之间的中间环节出了问题,也就是达人投放有问题。今天我们就为大家带来什么是小红书品牌笔记,如何做好达人投放? 一…

【c语言】if 选择语句

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

Navicat的使用

1. Navicat介绍 Navicat: 是一款流行的数据库管理和开发工具, 它支持多种数据库系统, 如: MySQL, MariaDB, MongoDB, SQL Server, Oracle, PostgreSQL 等. Navicat通过提供直观的图形用户界面(GUI), 使用户能够更轻松地执行各种数据库操作, 而无需记住复杂的SQL命令.以下是Nav…

PyQt5图片浏览器

PyQt5图片浏览器 实现方式功能实现具体代码 界面实现pillow源码修改ImageQt错误主页面布局 项目开源地址 分享一个图片浏览器 实现方式 qt本身有一个QGraphicsView类用来当做视图框架。 具体参考:如何在pyqt中使用 QGraphicsView 实现图片查看器 不过大佬给的例子…

聚集高速托盘类四向穿梭车ASRV|一车跑全仓可获得10000个货位的HEGERLS智能搬运机器人

随着国内外制造业加速转型升级,越来越多的企业需要进行物流智能化升级,但是往往受到仓库面积、高度、形状等现实条件的限制,以及市场不确定性因素的影响。因此,相对于投资传统的自动化立体库,企业更倾向于选择智能化、…

机器学习-01-课程目标与职位分析

总结 本系列是机器学习课程的第01篇,主要介绍本门课程的课程目标与职位分析 教材 数据挖掘与机器学习 课程教学方法 布鲁姆教学法 认知领域(cognitive domain) 1.知道(知识)(knowledge) 是指…

细嗦MySQL三大日志

文章目录 三大日志:binlog(归档日志)、redo log(重做日志)、undo log(回滚日志)redo log刷盘机制日志文件组 binlog记录格式写入机制 两阶段提交undo log提供回滚操作提供MVCC(多版本…

科技云报道:黑马Groq单挑英伟达,AI芯片要变天?

科技云报道原创。 近一周来,大模型领域重磅产品接连推出:OpenAI发布“文字生视频”大模型Sora;Meta发布视频预测大模型 V-JEPA;谷歌发布大模型 Gemini 1.5 Pro,更毫无预兆地发布了开源模型Gemma… 难怪网友们感叹&am…

【Excel PDF 系列】POI + iText 库实现 Excel 转换 PDF

你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,欢迎指教: 企鹅:869192208 文章目录 前言转换前后效果引入 pom 配置代码实现 前言 最近遇到生成 Excel 并转 pdf 的需求,磕磕碰碰总…

stm32——hal库学习笔记(DMA实验)

一、DMA介绍(了解) 二、DMA结构框图介绍(熟悉) 三、DMA相关寄存器介绍(熟悉) 四、DMA相关HAL库驱动介绍(掌握) 五、DMA配置步骤(掌握) 六、编程实战&#xff…

Anaconda和TensorFlow环境搭建!!

Anaconda下载 进入官网下载 https://www.anaconda.com/download 也可以通过清华的映像站下载: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 我这里下载的是3.4.20版本。下载好就可以安装默认安装就行。 打开Anaconda Prompt修改成国内镜像 conda c…

大概了解一下G1收集器

在上一篇文章中(链接:大概了解一下CMS收集器)我们提到,CMS是一种主要针对旧生代对象进行回收的收集器。与CMS不同,G1号称“全功能的垃圾收集器”,对初生代内存和旧生代内存均进行管理。鉴于此,这…

pyspark分布式部署随机森林算法

前言 分布式算法的文章我早就想写了,但是一直比较忙,没有写,最近一个项目又用到了,就记录一下运用Spark部署机器学习分类算法-随机森林的记录过程,写了一个demo。 基于pyspark的随机森林算法预测客户 本次实验采用的…

成功解决ModuleNotFoundError: No module named ‘cv2’

🔥 成功解决ModuleNotFoundError: No module named ‘cv2’ 🔥 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 …

中间件-Nginx漏洞整改(限制IP访问隐藏nginx版本信息)

中间件-Nginx漏洞整改(限制IP访问&隐藏nginx版本信息) 一、限制IP访问1.1 配置Nginx的ACL1.2 重载Nginx配置1.3 验证结果 二、隐藏nginx版本信息2.1 打开Nginx配置文件2.2 隐藏Nginx版本信息2.3 保存并重新加载Nginx配置2.4 验证结果2.5 验证隐藏版本…