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

设计模式-建造者模式

核心思想

  • 抽取共同的行为,允许使用者指定复杂对象的类型和内容,不需要了解内部的构建细节
  • 使用多个简单的行为构建一个复杂的对象,将对象的构建过程和它的表示分离,同样的构建过程可以创建不同的表示

在这里插入图片描述

优缺点

优点

  • 使用者不需要知道具体内部组成细节,产品本身与创建过程解耦
  • 具体建造者每个都是独立的,相互无关,不同的是控制产品的创建过程
  • 新增具体建造者不需要修改原来类的代码

缺点

  • 建造者所创建的产品一般要具有比较多的共同点,差异大的话不建议使用

代码示例

指挥者代码


/*** 指挥者*/
public class Director {/*** 构建对象* @param builder* @return*/public Computer createComputer(Builder builder){builder.buildMemory();builder.buildCpu();builder.buildMainboard();builder.buildDisk();builder.buildPower();return builder.getComputer();}
}

抽象建造者

/*** 建造者的公共方法*/
public interface Builder {/***方法*/void buildCpu();void buildMainboard();void buildDisk();void buildPower();void buildMemory();Computer getComputer();
}

具体建造者


public class HighComputerBuilder implements Builder{private Computer computer = new Computer();@Overridepublic void buildCpu() {computer.setCpu("高配 CPU");}@Overridepublic void buildMainboard() {computer.setMainboard("高配 主板");}@Overridepublic void buildDisk() {computer.setDisk("高配 磁盘");}@Overridepublic void buildPower() {computer.setPower("高配 电源");}@Overridepublic void buildMemory() {computer.setMemory("高配 内存");}@Overridepublic Computer getComputer() {return computer;}
}
public class LowComputerBuilder implements Builder{private Computer computer = new Computer();@Overridepublic void buildCpu() {computer.setCpu("低配 CPU");}@Overridepublic void buildMainboard() {computer.setMainboard("低配 主板");}@Overridepublic void buildDisk() {computer.setDisk("低配 磁盘");}@Overridepublic void buildPower() {computer.setPower("低配 电源");}@Overridepublic void buildMemory() {computer.setMemory("低配 内存");}@Overridepublic Computer getComputer() {return computer;}
}

产品


public class Computer {private String cpu;private String memory;private String mainboard;private String disk;private String power;public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}public String getMemory() {return memory;}public void setMemory(String memory) {this.memory = memory;}public String getMainboard() {return mainboard;}public void setMainboard(String mainboard) {this.mainboard = mainboard;}public String getDisk() {return disk;}public void setDisk(String disk) {this.disk = disk;}public String getPower() {return power;}public void setPower(String power) {this.power = power;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", mainboard='" + mainboard + '\'' +", disk='" + disk + '\'' +", power='" + power + '\'' +'}';}
}

测试

public class AppRun {public static void main(String[] args) {Director director = new Director();Computer computer = director.createComputer(new HighComputerBuilder());System.out.println(computer);}
}

在这里插入图片描述

public class AppRun {public static void main(String[] args) {Director director = new Director();Computer computer = director.createComputer(new LowComputerBuilder());System.out.println(computer);}
}

在这里插入图片描述

相关文章:

设计模式-建造者模式

核心思想 抽取共同的行为,允许使用者指定复杂对象的类型和内容,不需要了解内部的构建细节使用多个简单的行为构建一个复杂的对象,将对象的构建过程和它的表示分离,同样的构建过程可以创建不同的表示 优缺点 优点 使用者不需要知…...

flutter 设置app图标

使用插件 flutter_launcher_icons 在 pubspec.yaml 配置文件中 加入 dev_dependencies dev_dependencies: flutter_launcher_icons: "^0.13.1" 准备好app得 icon 图标 其中icon的名字为icon.png 创建assets文件夹 和子文件夹icon iamge 配置静态资源路径 完整配置…...

守护网络安全:深入了解DDOS攻击防护手段

ddos攻击防护手段有哪些?在数字化快速发展的时代,网络安全问题日益凸显,其中分布式拒绝服务(DDOS)攻击尤为引人关注。这种攻击通过向目标网站或服务器发送大量合法或非法的请求,旨在使目标资源无法正常处理其他用户的请求,从而达…...

计组 | 寻址方式

目录 一、知识点 1.寻址方式什么? 2.根据操作数所在的位置,都有哪些寻址方式? 3.直接寻址 4.立即寻址 5.隐含寻址 6.相对寻址 7.寄存器 8.寄存器-寄存器型(RR)、寄存器-存储器型(RS)和…...

matlab工具箱Filter Designer设计butterworth带通滤波器

1、在matlab控制界面输入fdatool; 2、在显示的界面中选择合适的参数;本实验中采样频率是200,低通30hz,高通60hz,点击butterworth滤波器。 3、点击设计滤波器按钮后,在生成的界面点击红框按钮,可生成simulink模型到当前…...

Python学习笔记第六十天(Matplotlib Pyplot)

Python学习笔记第六十天 Matplotlib Pyplot后记 Matplotlib Pyplot Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。 Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。 Pyplot 包含一系列绘图函数的相关函数,每个函数…...

服务器自动备份、打包、传输脚本

备份脚本 #!/bin/bash #author cheng #备份服务器自动打包归档每天的备份文件 Path/backhistory Host$(hostname) Date$(date %F) Dest${Host}_${Date}#创建目录 mkdir -p ${Path}/${Dest}#打包文件到目录 cd / && \#结合autoback.sh脚本,它往那个地方备&a…...

Docker 的数据管理 网络通信

目录 1.管理容器数据的方式 数据卷 数据卷的容器 2.操作命令 3.Docker 镜像的创建 1.管理容器数据的方式 数据卷 可以独立于容器生命周期存储的机制 可提供持久化 数据共享 docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash 数据卷的容器 用来提供持久化数…...

目标检测YOLO实战应用案例100讲-基于孤立森林算法的高光谱遥感图像异常目标检测

目录 前言 孤立森林算法的基本理论 2.1 引言 2.2 孤立森林算法的基本思想...

excel中两列数据生成折线图

WPS中excel的两列数据,第一列为x轴,第二列为y轴,生成折线图,并生成拟合函数。 1.选中两列数据,右击选择插入图表,选择XY(散点图),生成散点折线图 2.选中图中散点&#x…...

JS加密的域名锁定功能,JShaman支持泛域名

JShaman的域名锁定功能,支持泛域名 JShaman的JS代码混淆加密中,有一项“域名锁定”功能。使用此功能后,代码运行时会检测浏览器地址中的域名信息,如是非指定域名,则不运行,以此防止自己网站的JS代码被复制…...

概率论与数理统计:第七章:参数估计 第八章:假设检验

文章目录 Ch7. 参数估计7.1 点估计1.矩估计2.最大似然估计(1)离散型(2)连续型 7.2 评价估计量优良性的标准(1)无偏性 (无偏估计)(2)有效性(3)一致性 7.3 区间估计1.置信区间、置信度2.求μ的置信区间 Ch8. 假设检验1.拒绝域α、接受域1-α、H₀原假设、H₁备择假设2.双边检验、…...

【Kubernetes】Kubernetes的监控工具Promethues

Prometheus 一、Prometheus 概念1. Prometheus 概述2. Prometheus 的监控数据3. Prometheus 的特点4. Prometheus 和 zabbix 区别5. Prometheus 的生态组件5.1 Prometheus server5.2 Client Library5.3 Exporters5.4 Service Discovery5.5 Alertmanager5.6 Pushgateway5.7 Graf…...

【linux】2 Linux编译器-gcc/g++和Linux调试器-gdb

文章目录 一、Linux编译器-gcc/g使用1.1 背景知识1.2 gcc如何完成1.3 函数库1.4 gcc选项 二、linux调试器-gdb使用2.1 背景2.2 开始使用 总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)ノ" 一、Linux编译器-gcc/g使用 1.1 背景…...

【力扣每日一题】2023.8.17 切披萨的方案数

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个二维数组来表示一个披萨,其中‘A’表示披萨上的苹果。 让我们切k-1刀,把披萨切成 k 份&#xff0…...

Linux调试器-gdb使用

1. 背景 程序的发布方式有两种, debug 模式和 release 模式 Linux gcc/g 出来的二进制程序,默认是 release 模式 要使用 gdb 调试,必须在源代码生成二进制程序的时候 , 加上 - g 选项 2. 开始使用 gdb binFile 退出: ct…...

linux安装mysql错误处理

linux下mysql的安装与使用 linux安装mysql可有三种方式: 1、yum安装 2、源码安装 3、glibc安装 安装wget yum install -y wget https://blog.csdn.net/darendu/article/details/89874564?utm_sourceapp Linux上error while loading shared libraries问题解决方法…...

Matlab绘制灰度直方图

直方图是根据灰图像绘制的,而不是彩色图像通。查看图像直方图时候,需要先确定图片是否为灰度图,使用MATLAB2019查看图片是否是灰度图片,在读取图片后在MATLAB界面的工作区会显示读取的图像矩阵,如果是,那么…...

http学习笔记1

图解HTTP学习笔记 1.2 HTTP的诞生 CERN(欧洲核子研究组织)的蒂姆 • 伯纳斯 - 李(Tim BernersLee)博士提出了一种能让远隔两地的研究者们共享知识的设想。最初设想的基本理念是:借助多文档之间相互关联形成的超文本&am…...

PDF文件分割合并

PDF文件的分割和合并代码。 from PyPDF2 import PdfFileReader,PdfFileWriterdef pdf_split(filename,outputname)pr PdfFileReader(filename)for page in range(p.getNumPages()):pw PdfFileWriter()pw.addPage(pr.getPage(page))with open(f{outputname}{page}.pdf,wb) as…...

物联网无线通信方式总结

本文主要内容(一些物联网无线通信方式) 本文将介绍一些物联网无线通信方式的技术特点、底层调制方式和主要应用场景物联网无线通信方式是指利用无线技术实现物体之间的信息交换和网络连接的方式物联网无线通信方式的选择需要考虑多种因素,如传输距离、功耗、数据速…...

计算机竞赛 python的搜索引擎系统设计与实现

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python的搜索引擎系统设计与实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:5分创新点:3分 该项目较为新颖&#xff…...

ue5 场景搭建和灯光照明参考

https://www.youtube.com/watch?vOCgn40aWVuU https://www.youtube.com/watch?vIGLujClhL5U...

Mycat跨分片Join指南

前言Mycat目前版本支持跨分片的join,主要实现的方式有四种。 全局表 ER分片 HBT ShareJoin ShareJoin在开发版中支持,前面三种方式1.3.0.1支持 2.ShareJoin ShareJoin是一个简单的跨分片Join,基于HBT的方式实现。 目前支持2个表的join,原理就是解析SQL语句,拆分成单表的…...

网络:RIP协议

1. RIP协议原理介绍 RIP是一种比较简单的内部网关协议(IGP协议),RIP基于距离矢量的贝尔曼-福特算法(Bellman - Ford)来计算到达目的网络的最佳路径。最初的RIP协议开发时间较早,所以在带宽、配置和管理方面的要求也较低。 路由器运…...

如何优化因为高亮造成的大文本(大字段)检索缓慢问题

首先还是说一下背景,工作中用到了 elasticsearch 的检索以及高亮展示,但是索引中的content字段是读取的大文本内容,所以后果就是索引的单个字段很大,造成单独检索请求的时候速度还可以,但是加入高亮之后检索请求的耗时…...

HTML <table> 标签

实例 一个简单的 HTML 表格,包含两行两列: <table border="1"><tr><th>Month</th><th>Savings</th></tr><tr><td>January</td><td>$100</td></tr> </table>定义和用法 &l…...

ubuntu pdf阅读器okular

sudo apt-get install okular安装完毕后&#xff0c;使用如下命令浏览pdf文档 okular xxx.pdf...

根据源码,模拟实现 RabbitMQ - 虚拟主机 + Consume设计 (7)

目录 一、虚拟主机 Consume设计 1.1、承接问题 1.2、具体实现 1.2.1、消费者订阅消息实现思路 1.2.2、消费者描述自己执行任务方式实现思路 1.2.3、消息推送给消费者实现思路 1.2.4、消息确认 一、虚拟主机 Consume设计 1.1、承接问题 前面已经实现了虚拟主机大部分功…...

docker中bridge、host、container、none四种网络模式简介

目录 一.bridge模式 1.简介 2.演示 &#xff08;1&#xff09;运行两个容器&#xff0c;不指定网络模式情况下默认是bridge模式 &#xff08;2&#xff09;在主机中自动生成了两个veth设备 &#xff08;3&#xff09;查看两个容器的IP地址 &#xff08;4&#xff09;可以…...

常宁网站建设/百度热门排行榜

–ACC建模大数据用于精简用例的实践 作者&#xff1a;emilyxlchen生活的智慧&#xff0c;有时不在于多&#xff0c;而在于少。同理适用于测试用例的管理中。 一&#xff0e;热身活动&#xff1a;数一数你的产品总用例 随着互联网时代节奏的日益加快&#xff0c;许多产品都会…...

如何创建网站的详细步骤/公司网站推广怎么做

现在有n个人要排成一列&#xff0c;编号为1->n 。但由于一些不明原因的关系&#xff0c;人与人之间可能存在一些矛盾关系&#xff0c;具体有m条矛盾关系(u,v),表示编号为u的人想要排在编号为v的人前面。要使得队伍和谐&#xff0c;最多不能违背k条矛盾关系&#xff08;即不能…...

福安做网站/微信群拉人的营销方法

本公众号 的系列文章《跟热饭一起学习vue吧》&#xff0c;本文会采用非常土&#xff0c;非常low的语言&#xff0c;让读者学习并立即上手即可使用vue去写前端页面。简单生动&#xff0c;由浅入深。那么&#xff0c;就一起开始学习吧&#xff0c;体验一把又土又油腻的教程吧~ 别…...

桂林商品房做民宿在哪个网站登记好/软文推广广告

...

希腊网站 后缀/淘宝流量网站

先恒流充电至4.2V,再恒压4.2V 18650锂电池&#xff0c;很多人刚开始的时候都会惊讶为什么会用这一串数字来命名。18650是分别代表着直径和高度的圆柱体电池。现在多用于称单颗移动照明的锂电池等。 18650锂电池的标称电压同样是3.7V&#xff0c;最高限制电压4.2V。常用在强光手…...

驻马店做网站建设的公司/做推广的技巧

先设置单元格字体类型 和字体大小 HSSFFont hfont workbook.createFont(); hfont.setFontName("&#xff2d;&#xff33; &#xff30;ゴシック"); hfont.setFontHeightInPoints((short)10); 然后使用 hssfsheet.autoSizeColumn((short)columnNumb…...