建造者模式定义
定义:建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
先分析模型图上的四大部分:
-
Product:产品类,指要创建的复杂对象,通常实现了模板方法模式。
-
Builder:抽象建造类,规范产品的组建,一般是由子类实现的。
-
ConcreteBuilder:具体建造类,实现抽象建造类定义的方法并返回一个建造好的对象。
-
Director:导演类,也就是指挥者,负责安排流程。
实例说明
就拿建造房屋举例吧:这里假设建造两种类型的房屋,别墅和普通房屋;两种类型的建造流程顺序不同;别墅为A-B-C三步,普通房屋为C-B-A三步。
1.首先定义出Product类,VillaModel和OrdinaryhouseModel
(1).抽象产品类
public abstract class HouseModel {
//定义执行的顺序,放在集合内
private List<String> OrderList=new ArrayList<>();
//建造房屋的步骤,不分先后,不同的房屋,顺序不同
protected abstract void buildstepA();
protected abstract void buildstepB();
protected abstract void buildstepC();
/*
建造房屋
*/
final public void build(){
for (int i=0;i<this.OrderList.size();i++){
String name =this.OrderList.get(i);
if (name.equalsIgnoreCase("stepA")){
this.buildstepA();
}else if (name.equalsIgnoreCase("stepB")){
this.buildstepB();
}else if (name.equalsIgnoreCase("stepC")){
this.buildstepC();
}
}
}
//设置顺序
public void setOrderList(List<String> orderList) {
OrderList = orderList;
}
}
(2).两个实现类
public class VillaModel extends HouseModel {
@Override
protected void buildstepA() {
System.out.println("别墅建造步骤A操作");
}
@Override
protected void buildstepB() {
System.out.println("别墅建造步骤B操作");
}
@Override
protected void buildstepC() {
System.out.println("别墅建造步骤C操作");
}
}
public class OrdinaryhouseModel extends HouseModel {
@Override
protected void buildstepA() {
System.out.println("普通房屋建造步骤A操作");
}
@Override
protected void buildstepB() {
System.out.println("普通房屋建造步骤B操作");
}
@Override
protected void buildstepC() {
System.out.println("普通房屋建造步骤C操作");
}
}
2.定义Builder抽象建造类,也就是写两种房屋的建造方式.
public abstract class HouseBuilder {
//为了设置建造顺序
public abstract void setOrderList(List<String> orderList);
//获取安排完建造顺序的对应的房屋
public abstract HouseModel getHouseModel();
}
3.定义ConcreteBuilder具体建造类,也就是两种房屋建造类实现上面定义的Builder
//别墅
public class VillaBuilder extends HouseBuilder {
private VillaModel villaModel=new VillaModel();
@Override
public void setOrderList(List<String> orderList) {
this.villaModel.setOrderList(orderList);
}
@Override
public HouseModel getHouseModel() {
return this.villaModel;
}
}
//普通房屋
public class OrdinaryhouseBuilder extends HouseBuilder {
private OrdinaryhouseModel ordinaryhouseModel=new OrdinaryhouseModel();
@Override
public void setOrderList(List<String> orderList) {
this.ordinaryhouseModel.setOrderList(orderList);
}
@Override
public HouseModel getHouseModel() {
return this.ordinaryhouseModel;
}
}
注意:上面的准备工作都做完了,为了更深刻的理解Director<导演类>,我们先不加Director,直接去实现此实例。
不加入Director类,实现方式就是直接设置顺序,以建造别墅为例,代码如下:
List<String> OrderList=new ArrayList<>();
OrderList.add("stepA");
OrderList.add("stepB");
OrderList.add("stepC");
VillaBuilder villaBuilder=new VillaBuilder();
villaBuilder.setOrderList(OrderList);
VillaModel villaModel= (VillaModel) villaBuilder.getHouseModel();
villaModel.build();
这还只是别墅的建造,代码是不是很臃肿?所以封装是必须的,既加上Director类来指挥(封装)顺序。
4.定义Director类,也就是对已知的两种房屋的建造步骤进行封装
public class Director {
private List<String> OrderList=new ArrayList<>();
private OrdinaryhouseBuilder ordinaryhouseBuilder=new OrdinaryhouseBuilder();
private VillaBuilder villaBuilder=new VillaBuilder();
/*
普通房屋建造步骤封装
*/
public OrdinaryhouseModel getHouseModel(){
this.OrderList.clear();
this.OrderList.add("stepC");
this.OrderList.add("stepB");
this.OrderList.add("stepA");
this.ordinaryhouseBuilder.setOrderList(OrderList);
return (OrdinaryhouseModel) this.ordinaryhouseBuilder.getHouseModel();
}
/*
别墅建造步骤封装
*/
public VillaModel getvillaModel(){
this.OrderList.clear();
this.OrderList.add("stepA");
this.OrderList.add("stepB");
this.OrderList.add("stepC");
this.villaBuilder.setOrderList(OrderList);
return (VillaModel) this.villaBuilder.getHouseModel();
}
}
这时实现实例的代码如下:
Director director=new Director();
director.getHouseModel().build();
director.getvillaModel().build();
运行结果:
加入了Director类后调用是不是感觉很简单,清晰了。另外如果两种房屋的建造步骤有变化了,可以直接在Director类封装新的顺序。
建造者模式应用
1.实用范围
-
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
-
当构造过程必须允许被构造的对象有不同表示时。
2.建造者模式的优缺点
(1).优点
-
封装性好
-
具体建造类之间独立,扩展性好
(2).缺点
产生多余的Build对象以及Dirextor类。
3.建造者模式与工厂模式的区别
这两种模式很相似,建造者模式更注重于方法的调用顺序,而工厂模式注重于创建产品。具体的区别还是推荐大家去亲身去了解一下这两种模式。
文章学习参考了《设计模式之禅》《Android进阶之光》
推荐阅读
相关推荐
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
西门子224XP十显控触摸屏下的螺杆式空压机工频运行控制策略及程序注释解析,螺杆式空压机工频运行,变频机上用不了!!!使用西门子224xp 十显控触摸屏,程序有注释,可直接用于工程 ,核心关键词:螺杆式空压机;工频运行;变频机;西门子224xp;十显控触摸屏;程序注释;工程使用。,西门子224XP空压机控制程序工频变频切换方案
# 基于Arduino的Tellarium天文模拟系统 ## 项目简介 Tellarium是一个基于Arduino平台的天文模拟系统,旨在通过步进电机驱动行星模型,模拟行星的轨道运动。该项目通过串行通信接收用户指令,并使用DCF77库处理时间信号,以确保行星的运动与真实世界的时间同步。 ## 项目的主要特性和功能 1. 步进电机控制精确控制步进电机,实现行星模型的平滑运动。 2. 串行通信通过串行端口接收用户指令,如设置行星速度、启动或停止电机。 3. DCF77时间信号接收使用DCF77库接收时间信号,确保行星运动与真实时间同步。 4. 日志和调试提供日志输出和调试LED闪烁功能,便于开发者进行调试和问题排查。 5. 时间管理包括获取和设置时间、处理时间字符串等功能,确保系统时间的准确性。 ## 安装使用步骤 1. 硬件准备确保所有必要的硬件已正确连接,包括步进电机、磁铁传感器、Arduino板等。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
内容概要:文章介绍了针对COVID-19的药物再利用的创新方法,这种方法融合了基于文献的知识(LitCovid和CORD-19数据集)及先进的知识图谱补全技术。具体采用了基于神经网络的TransE、RotatE等多种算法预测药物再利用的潜力,并通过开放和封闭的发现模式为预测结果提供合理的机制解释,包括发现模式、准确性分类及定性评估等手段,增强了方法的实用性。研究表明,TransE表现最优,并成功预测并验证了一系列药物作为COVID-19的治疗候选人选。此外,方法不仅适用于COVID-19,还具备应用于其他疾病药物再利用及其他临床问题解决的潜力。此研究为快速高效地推进药物再利用提供了一个新的计算框架。 适合人群:生物医学科研人员,从事药品再利用、人工智能药物筛选的专业研究人员,对生物信息数据分析和处理感兴趣的学者或技术人员。 使用场景及目标:① 利用计算模型预测药物能否被重新应用于新的适应症,尤其是在面对突发公共卫生事件时加快新药物的研发进程。② 对现有药物进行再评价,以发现更广泛、安全、有效的治疗用途,为临床治疗提供依据和理论指导。③ 探讨通过自动化手段发掘药物作用机理的技术路径。 其他说明:作者团队来自多个国家和地区,研究获得了多项国家级基金支持,论文详尽描述了实验细节,并附上了全部代码和数据资源供后续拓展和重复研究使用。
QT 串口源码 串口实例 QT 串口助手代码 (2),含有完整的代码
2025年最新酒店客房部经理考试题答案.docx
# 基于Arduino的陶瓷加热器控制系统 ## 项目简介 这是一个基于Arduino的陶瓷加热器控制系统项目,旨在实现对陶瓷加热器的精确控制,适用于实验室、工业生产等需要精确控温的场合。 ## 项目的主要特性和功能 陶瓷加热器控制通过Arduino板控制陶瓷加热器的开关。 温度获取与转换采用ADC值获取温度,并通过查找表转换为实际温度。 目标温度设置允许用户设置目标温度。 错误检测与处理检测加热器的错误状态,如温度过高或短路等。 调试模式提供调试功能,方便开发者调试和测试。 ## 安装使用步骤 1. 下载并解压项目源码文件。 2. 将解压后的文件复制到Arduino的sketchbook目录中。 3. 连接陶瓷加热器到Arduino板上的指定引脚。 4. 使用USB线连接Arduino板到计算机。 5. 在Arduino IDE中打开项目文件,选择正确的Arduino板型号和端口。 6. 上传代码到Arduino板。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
CatBoost-shap集成模型:分类任务的解释与可视化Python代码实现,自带数据集,即插即用,全部图形直观展现,CatBoost-shap集成模型用于分类任务,对模型和变量用shap进行解释 Python 代码,自带数据集可以直接运行 所有图所见即所得 ,核心关键词:CatBoost-shap; 分类任务; 模型解释; 变量解释; Python代码; 自带数据集; 直接运行; 图形化结果。,"CatBoost模型SHAP解释器:分类任务图解"
项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
基于西门子S7-1200 PLC与Wincc组态技术的智能路口交通指挥系统解决方案。,No.698 西门子S7-1200 和Wincc组态基于PLC的路口交通指挥系统 ,No.698; 西门子S7-1200; Wincc组态; PLC; 路口交通指挥系统; 交通控制系统。,基于PLC与Wincc组态的西门子S7-1200交通指挥系统
西门子S7-200 PLC控制的灯泡安装工作站系统设计:高效、智能的自动化解决方案,No.662 基于西门子S7-200 PLC的灯泡安装工作站的控制系统设计 ,基于西门子S7-200 PLC; 灯泡安装工作站; 控制系统设计,西门子S7-200 PLC控制灯泡安装站设计 No.662
PHP从入门到精通课程资料+pdf
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
LBM格子玻尔兹曼方法在Matlab中模拟3D气泡上升多相流的应用研究,lbm格子玻尔兹曼方法模拟3D气泡上升多相流 matlab ,LBM;格子玻尔兹曼方法;3D气泡上升;多相流模拟;Matlab,LBM格子玻尔兹曼模拟3D气泡多相流上升过程 Matlab实现
SQL Server 从入门到精通-pdf
"混合储能功率共享系统:基于滑动平均与多通道FFT的功率分配及模糊控制SOC管理策略",混合储能功率共享系统 光伏发出的功率与负载消耗功率的差值即混合储能的功率,将混合储能功率通过滑动平均后剩下的功率差值通过多通道FFT进行二次划分;二次划分得到的低频功率分量与之前的滑动平均得到的成分一起分给蓄电池进行平抑,最后剩下的高频部分交给超级电容进行平抑 soc通过模糊控制进行管理 ,混合储能;功率共享;滑动平均;多通道FFT;低频功率;soc管理;超级电容;蓄电池平抑,混合储能功率管理系统的设计与优化
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
ollama