课程资源库网站开发的研究现状/网页制作教程视频
目录
- 建造者模式
- 盖房项目需求
- 基本介绍
- 四个角色
- 实例代码
- 注意事项和细节
- 抽象工厂模式 VS 建造者模式
建造者模式
盖房项目需求
- 传统方式:打地基,砌墙,封顶
盖房子步骤
public abstract class AbstractHouse {// 地基public abstract void buildBasic();// 砌墙public abstract void buildWall();// 封顶public abstract void buildFed();// 建造public void build(){buildBasic();buildWall();buildFed();}
}
盖普通房子
public class CommonHouse extends AbstractHouse{@Overridepublic void buildBasic() {System.out.println("普通房子打地基");}@Overridepublic void buildWall() {System.out.println("普通房子砌墙");}@Overridepublic void buildFed() {System.out.println("普通房子封顶");}
}
测试
public class Client {public static void main(String[] args) {new CommonHouse().build();}
}
这种方式的优缺点
- 优点是简单好理解,简单易操作
- 设计的程序结构,过于简单,乜有设计缓存层对象,程序的扩展和维护性不好,也就是说,这种设计方案,把产品(即:房子)和 创建产品的过程(即:建房子流程)封装在一起,耦合性增强了
- 解决方案:将产品和产品建造过程解耦==> 建造者模式
基本介绍
-
建造者模式又叫生成器模式,是一种对象构建模式,他可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
-
建造者模式是一步一步创建一个复杂的对象,他允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节
四个角色
- Product(产品角色): 一个具体的产品对象
- Builder (抽象建造者): 创建 Product对象的各个部件指定的接口/抽象类
- ConcreteBuilder (具体建造者): 实现接口,构建和装配各个部件
- 建造一个使用Builder接口的对象,它主要是用于创建一个复杂的对象,它主要有两个作用,一个是:隔离了产品和对象的生产过程,另一个是:负责控制产品对象的生产过程
实例代码
抽象的建造者 ==> Build
public interface HouseBuild {House HOUSE = new House();// 将建造的流程规定好void buildBasic();void buildWall();void buildRoofed();// 返回建造的房子default House buildHouse() {return HOUSE;}
}
- 产品
- 具体建造者 ConcreteBuilder (具体建造者)
public class HighHouse implements HouseBuild {@Overridepublic void buildBasic() {System.out.println("高楼打地基");}@Overridepublic void buildWall() {System.out.println("高楼打地基");}@Overridepublic void buildRoofed() {System.out.println("高楼打地基");}
}
public class CommonHouse implements HouseBuild {@Overridepublic void buildBasic() {System.out.println("普通房子打地基");}@Overridepublic void buildWall() {System.out.println("普通房子打地基");}@Overridepublic void buildRoofed() {System.out.println("普通房子打地基");}
}
Director (指挥者)
public class HouseDirect {private HouseBuild houseBuild = null;// 使用构造器注入houseBuild对象public HouseDirect(HouseBuild houseBuild) {this.houseBuild = houseBuild;}public void setHouseBuild(HouseBuild houseBuild) {this.houseBuild = houseBuild;}// 建造房子public House constructHouse(){houseBuild.buildBasic();houseBuild.buildWall();houseBuild.buildRoofed();return houseBuild.buildHouse();}
}
测试
public class Client {public static void main(String[] args) {System.out.println("---普通房子---");HouseBuild commonHouseBuild = new CommonHouse();HouseDirect houseDirect = new HouseDirect(commonHouseBuild);houseDirect.constructHouse();System.out.println("---高楼---");HouseBuild highHouseBuild = new HighHouse();// 修改houseDirect为HighHousehouseDirect.setHouseBuild(highHouseBuild);houseDirect.constructHouse();}
}
注意事项和细节
- 客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象
- 可以更加精细的控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加的清晰,也更方便使用程序来控制创建过程
- 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合开闭原则
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似, 如果产品之间的差异性很大,则不适合使用建造者模式 因此其使用范围收到一定的影响
- 如果产品的内部变化很复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,因此在这种情况下,要考虑是否选择建造者模式
抽象工厂模式 VS 建造者模式
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不通分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可,而建造者模式则是要按照指定的蓝图建造产品,他的主要目的是通过组装零配件而生产一个新产品
相关文章:

设计模式——建造者模式
目录 建造者模式盖房项目需求基本介绍四个角色实例代码注意事项和细节抽象工厂模式 VS 建造者模式 建造者模式 盖房项目需求 传统方式:打地基,砌墙,封顶 盖房子步骤 public abstract class AbstractHouse {// 地基public abstract void b…...

Go语言用Colly库编写的图像爬虫程序
下面是一个使用Colly库编写的Go语言图像爬虫程序,该程序会爬取news.qq上的图片,并使用proxy_host:duoip和proxy_port:8000的爬虫IP服务器进行抓取。 package mainimport ("fmt""net/http""github.com/crawlab-collective/go-co…...

14.2 并发与竞争实验
一、原子操作实验 这节使用原子操作来实现对 LED 设备的互斥访问,也就是只有一个应用程序能使用 LED。 1.1 实验程序编写 因为是 12 章已经修改了设备树,所以这里暂时不用修改。 在 /linux/atk-mpl/Drivers 该目录下创建 7_atomic 子目录,并且…...

【MediaTek】T750实现Host 网络和Guest 网络隔离以及各个连接终端间隔离功能
T750 WiFi WiFi芯片MT7915AN Wi-Fi 标准IEEE 802.11a/b/g/n/ac/ax支持的速率802.11ax: 4 到 2400 Mbps802.11ac: 6.5 到 1732 Mbps802.11n: 6.5 到 600 Mbps802.11a/g:6 到 54 Mbps802.11b: 1 到 11 Mbps支持的信道2.4 GHz:1-135 GHz:36-64、100-144 和 149-165多输入多输…...

数字滤波器之高通滤波器设计
文章来源地址:https://www.yii666.com/blog/393376.html 通过在Z平面放置零极点的来设计数字滤波器 要求:设计一款高通滤波器,用在音频信号处理过程中,滤掉100Hz以下的信号。 实现方法:通过在Z平面放置零极点的来设…...

【leetcode】58.最后一个单词的长度
题目 最后一个单词的长度 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s “Hello World”…...

用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组
目录 一、冒泡排序 1.冒泡排序介绍 2.排序的思路 3.完整代码 二、折半查找 1.折半查找介绍 2.查找的思路 3.完整代码 三、逆序数组 1.逆序思路 2..完整代码 一、冒泡排序 冒泡排序是众多排序的一种,无论在C语言或者Java中都很常见,后续在数据…...

antd本地上传excel文件并读取文件的数据转为json
1.写一个上传 这里直接用upload组件即可 <Upload {...uploadProps} maxCount{1} accept{".xlsx"}><Button icon{<UploadOutlined />}>{${formatMessage({id: clk_upload}, {file: formatMessage({id: excel_file})})}}</Button></Uploa…...

BI数据可视化:不要重复做报表,只需更新数据
BI数据可视化是一种将大量数据转化为视觉形式的过程,使得用户可以更容易地理解和分析数据。然而,传统的报表制作过程往往需要手动操作,不仅耗时还容易出错。为了解决这个问题,BI数据可视化工具通常会提供一些自动化的数据更新功能…...

fiddler抓包拦截请求转发到其他地址
使用Fiddler拦截请求转发到指定地址方便于本地调试,不需要进行打包切换地址,可以加快问题的确定修复效果 内容: 1:首先给app进行设置代理抓包内容,给进行 https://blog.csdn.net/qq_43717814/article/details/84317038…...

【Shell编程】| if 判断
最近在编写一些测试程序的时候,对if的使用较为片面,很多小的功能都需要去各个地方百度查询,极为不便,因此也想着空闲时候,对if进行详细总结,一来加深印象,二来是为了打造一个if语句的最详细的使…...

Java手动引入Maven依赖的Jar包
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…...

计算机毕设 基于大数据的社交平台数据爬虫舆情分析可视化系统
文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕…...

conda取消自动进入base环境
安装conda后取消命令行前出现的base,则默认进入了conda环境,如果想取消每次启动自动激活conda的基础环境。 方法一 每次在命令行通过conda deactivate退出base环境回到系统自带的环境 如果再进入的话: conda deactivate 方法二 1&#…...

【文生图】Stable Diffusion XL 1.0模型Full Fine-tuning指南(U-Net全参微调)
文章目录 前言重要教程链接以海报生成微调为例总体流程数据获取POSTER-TEXTAutoPosterCGL-DatasetPKU PosterLayoutPosterT80KMovie & TV Series & Anime Posters 数据清洗与标注模型训练模型评估生成图片样例宠物包商品海报护肤精华商品海报 一些TipsMata:…...

STM32笔记—DMA
目录 一、DMA简介 二、DMA主要特性 三、DMA框图 3.1 DMA处理 3.2 仲裁器 3.3 DMA通道 扩展: 断言: 枚举: 3.4 可编程的数据传输宽度、对齐方式和数据大小端 3.5 DMA请求映像 四、DMA基本结构 4.1 DMA_Init配置 4.2 实现DMAADC扫描模式 实现要求…...

机器学习概论
一、机器学习概述 1、机器学习与人工智能、深度学习的关系 人工智能:机器展现的人类智能机器学习:计算机利用已有的数据(经验),得出了某种模型,并利用此模型预测未来的一种方法。深度学习:实现机器学习的一种技术 2…...

卡尔曼家族从零解剖-(04)贝叶斯滤波→细节讨论,逻辑梳理,批量优化
讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的 卡尔曼家族从零解剖 链接 :卡尔曼家族从零解剖-(00)目录最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/133846882 文末正下方中心提供了本人 联系…...

小菜React
1、Unterminated regular expression literal, 对于函数就写.ts,有dom元素就写.tsx 2、 The requested module /src/components/setup.tsx?t1699255799463 does not provide an export named Father export default useStore默认导出的钩子,组件引入的…...

新手用mac电脑,对文件的疑问和gpt回应
macOs系统安装软件的疑问 所有问题mac系统文件结构我用mac安装软件,不用像windows一样创建文件夹吗只能安装到Applications文件夹吗安装程序的指南和提供的安装选项是什么软件安装在Applications下的/appName文件夹,它的所有数据都会在该文件夹吗如果卸载…...

LeetCode|动态规划|392. 判断子序列、115. 不同的子序列、 583. 两个字符串的删除操作
目录 一、392. 判断子序列 1.题目描述 2.解题思路 3.代码实现(双指针解法) 4.代码实现(动态规划解法) 二、115. 不同的子序列 1.题目描述 2.解题思路 3.代码实现(C语言版本) 4.代码实现(C版本) …...

vscode 阅读 android以及kernel 源码
在Ubuntu系统中安装vscode 参考文档: https://blog.csdn.net/m0_57368670/article/details/127184424 1, 下载vscode https://code.visualstudio.com 2, 安装vscode $ sudo dpkg -i code_1.78.1-1683194560_amd64.deb 3, 打开vscode $ code vscode 阅读 android…...

Intel oneAPI笔记(3)--jupyter官方文档(SYCL Program Structure)学习笔记
前言 本文是对jupyterlab中oneAPI_Essentials/02_SYCL_Program_Structure文档的学习记录,包含对Device Selector、Data Parallel Kernel、Host Accessor、Buffer Destruction、的介绍,最后还有一个小关于向量(Vector)加法的实例 …...

verilog——移位寄存器
在Verilog中,你可以使用移位寄存器来实现数据的移位操作。移位寄存器是一种常用的数字电路,用于将数据向左或向右移动一个或多个位置。这在数字信号处理、通信系统和其他应用中非常有用。以下是一个使用Verilog实现的简单移位寄存器的示例: m…...

C++11 多线程学习笔记
1. thread — 线程篇 所需头文件:<thread> 1.1 构造函数 // 1 默认构造函数 thread() noexcept; // 2 移动构造函数,把other的所有权转移给新的thread对象,之后 other 不再表示执行线程。 thread( thread&& other ) noex…...

nn.embedding函数详解(pytorch)
提示:文章附有源码!!! 文章目录 前言一、nn.embedding函数解释二、nn.embedding函数使用方法四、模型训练与预测的权重变化探讨 前言 最近发现prompt工程(如sam模型),也有transform的detr模型等都使用了nn.Embedding函…...

gitee.com[0: xxx.xx.xxx.xx]: errno=Unknown error
git在提交或拉取代码的时候,遇到以下报错信息: Unable to connect to gitee.com[0: xxx.xx.xxx.xx]: errnoUnknown error 解决问题步骤: 1、找到自己的电脑上的git用户配置文件 文件位置位于:C:\Users\用户名\.gitconfig 比如我…...

bug: https://aip.baidubce.com/oauth/2.0/token报错blocked by CORS policy
还是跟以前一样,我们先看报错点:(注意小编这里是H5解决跨域的,不过解决跨域的原理都差不多) Access to XMLHttpRequest at https://aip.baidubce.com/oauth/2.0/token from origin http://localhost:8000 has been blo…...

简单工厂VS工厂方法
工厂方法模式–制造细节无需知 前面介绍过简单工厂模式,简单工厂模式只是最基本的创建实例相关的设计模式。在真实情况下,有更多复杂的情况需要处理。简单工厂生成实例的类,知道了太多的细节,这就导致这个类很容易出现难维护、灵…...

使用VSCODE链接Anaconda
打代码还是在VSCODE里得劲 所以得想个办法在VSCODE里运行py文件 一开始在插件商店寻找插件 但是没有发现什么有效果的 幸运的是VSCODE支持自己选择Python的编译器 打开VSCODE 按住CtrlShiftP 输入Select Interpreter 如果电脑已经安装上了Python的环境 VSCODE会默认选择普通…...