Java设计模式(四)Builder建造者模式
一、场景描述
建造者模式同工厂模式、抽象工厂模式一样,用于创建继承类对象。
工厂模式:http://www.cnblogs.com/mahongbiao/p/8618970.html
抽象工厂模式:http://www.cnblogs.com/mahongbiao/p/8619054.html
所不同的是,工厂模式下,各子类实现接口,通过工厂类创建子类对象;而建造者模式下,各子类拥有其建造者类,通过它创建不同的父类对象,最终实现多态,实际上子类、父类在代码中是不存在的。
以仪器数据采集工具为例,工厂模式下,定义接口“仪器数据采集工具”,定义子类“PDF文件数据采集工具”和“Excel文件数据采集工具”,子类实现接口。通过工厂类(无论是静态工厂类还是抽象工厂类),创建子类对象,这些对象拥有不同的表现方式,即为多态。
在建造者模式下,定义父类“仪器数据采集工具”,然后通过“PDF文件数据采集工具的建造者类”和“Excel文件数据采集工具的建造者类”来为“仪器数据采集工具”的类对象赋予不同的表现方式(为字段赋予不同的值等),最终实现多态。
建造者模式下,Director好比导演一般,它来调用建造者Builder完成对类对象的创建,调用者调用Director即可,如下图所示:

当然,工厂模式字面意义是用于创建对象,而建造者模式字面意义是建造不同的对象,两者能实现类似的功能,但两者的应用场景大可不同。
工厂模式应用于某简单类对象的创建,而建造者模式应用于复杂类对象的建造,具体可百度学习体会。
扩展时,例如新增Word文件数据采集,创建其Builder类即可,该类实现Word文件数据采集程序的创建工作;调用时使用WordBuilder类即可调用。
二、示例代码
(父)类:
package lims.designpatterndemo.builderdemo;
public class EquipmentDataCapture {
private String filePath;
private String equipmentData;
//
public String getFilePath(){
return this.filePath;
}
public void setFilePath(String filePath){
this.filePath = filePath;
}
public String getEquipmentData(){
return this.equipmentData;
}
public void setEquipmentData(String equipmentData){
this.equipmentData = equipmentData;
}
}
建造者接口:
package lims.designpatterndemo.builderdemo;
public interface EquipmentDataCaptureBuilder {
//部件
void buildFilePath();
void buildEquipmentData();
//组装
EquipmentDataCapture buildEquipmentDataCapture();
}
PDF数据采集建造者类:
package lims.designpatterndemo.builderdemo;
public class PdfFileCaptureBuilder implements EquipmentDataCaptureBuilder{
//
EquipmentDataCapture capture;
//构造
public PdfFileCaptureBuilder(){
capture = new EquipmentDataCapture();
}
//
@Override
public void buildFilePath() {
capture.setFilePath(".pdf");
}
@Override
public void buildEquipmentData() {
capture.setEquipmentData("pdf file content");
}
@Override
public EquipmentDataCapture buildEquipmentDataCapture() {
return capture;
}
}
Excel数据采集建造者:
package lims.designpatterndemo.builderdemo;
public class ExcelFileCaptureBuilder implements EquipmentDataCaptureBuilder{
//
EquipmentDataCapture capture;
//构造
public ExcelFileCaptureBuilder(){
capture = new EquipmentDataCapture();
}
@Override
public void buildFilePath() {
capture.setFilePath(".xlsx");
}
@Override
public void buildEquipmentData() {
capture.setEquipmentData("excel file content");
}
@Override
public EquipmentDataCapture buildEquipmentDataCapture() {
return capture;
}
}
Director类,可以简单理解为导演类:
package lims.designpatterndemo.builderdemo;
public class EquipmentDataCaptureDirector {
public EquipmentDataCapture constructEqiupmentDataCapture(EquipmentDataCaptureBuilder builder){
builder.buildFilePath();
builder.buildEquipmentData();
EquipmentDataCapture capture = builder.buildEquipmentDataCapture();
return capture;
}
}
调用端示例:
package lims.designpatterndemo.builderdemo;
public class BuilderDemo {
public static void main(String[] args) {
EquipmentDataCaptureDirector direcotr = new EquipmentDataCaptureDirector();
EquipmentDataCaptureBuilder builder = new PdfFileCaptureBuilder();
builder = new ExcelFileCaptureBuilder();
EquipmentDataCapture capture = direcotr.constructEqiupmentDataCapture(builder);
System.out.println(capture.getEquipmentData());
}
}
Java设计模式(四)Builder建造者模式的更多相关文章
- Java设计模式学习记录-建造者模式
前言 今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发企业内部系统的这种传统开发,感觉这 ...
- java设计模式-----6、建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类 ...
- Java设计模式14:建造者模式
什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家. 建造者模式是什么呢?用一句话概括就是建造者模式的目的是为了分离对象的属性与创建过程,是 ...
- Java设计模式之(建造者模式)
建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式通常包括下面几个角色: 1. builder:抽象建造者,给出一个抽象接口,以规范产品对象的各个组 ...
- JAVA设计模式之【建造者模式】
建造者模式 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品 角色 Builder抽象建造者 buildPartX getResult ConcreteBuilder具体建 ...
- 【java设计模式】-05建造者模式
建造者模式 简述 建造者模式,是将一个复杂对象的创建和它的表示分离开来,这就使得同样的构建构成可以有不同的表示. 建造者模式是一步步构建一个复杂的对象,允许用户只需要指定复杂对象的类型和必要的内容就可 ...
- Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)
1 概念定义 1.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2 类型 创建类模式 2 原理特征 2.1 类 ...
- 设计模式之Builder建造者模式 代码初见
public class EmployeeBuilder { private int id = 1; private string firstname = "first"; pri ...
- 重学 Java 设计模式:实战建造者模式
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 乱码七糟 [luàn qī bā zāo],我时常怀疑这个成语 ...
- 重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)
作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么你的代码那么多ifelse 同类的业务.同样的功能, ...
随机推荐
- 在SpringBoot中配置定时任务
前言 之前在spring中使用过定时任务,使用注解的方式配置很方便,在SpringBoot中的配置基本相同,只是原来在spring中的xml文件的一些配置需要改变,在SpringBoot中也非常简单. ...
- (转载)SVM-基础(三)
支持向量机: Kernel by pluskid, on 2010-09-11, in Machine Learning 70 comments 本文是"支持向量机系列" ...
- linux清屏命令(clear,reset)
(1)clear 这个命令将会刷新屏幕,本质上只是让终端显示页向后翻了一页,如果向上滚动屏幕还可以看到之前的操作信息.一般都会用这个命令. (2)reset 这个命令将完全刷新终端屏幕,之前的终端输入 ...
- 校验Linux程序是否被黑客修改
一个黑客突破你的层层防御后,修改你的程序或者覆盖了你的工具时.确定一个已安装程序的所有文件,有没有被修改过的途径之一就是使用RPM包校验功能 如果图片排版有任何错误,欢迎访问我的简书www.jians ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 简介 这是一篇关于Redis使用的总结类型文章,会先简单的谈一下缓存 ...
- Servlet Cookie取不到值原因
现象: 在测试带Cookie的HTTP请求时发现,服务端用request.getHeader("cookie")可以去到值; 但是用request.getCookies()却不行 ...
- 2.5 非透明PCI桥
PCI桥规范定义了透明桥的实现规则,本篇在第2.3.1节中详细介绍了这种桥片.通过透明桥,处理器系统可以以HOST主桥为根节点,建立一颗PCI总线树,在这个树上的PCI设备共享同一个PCI总线域上的地 ...
- Flex中一些属性总结
Flex中一些属性总结 1.buttonMode = "true" 鼠标变成手形 2.useHandCursor = "true" 鼠标变成手形
- 如何访问pcie整个4k的配置空间
目前用于访问PCIe配置空间寄存器的方法需要追溯到原始的PCI规范.为了发起PCI总线配置周期,Intel实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这种方法可以访问所 ...
- C# Split 根据组合字符进行拆分数组用法
C# Split 根据组合字符进行拆分数组用法,如下代码: string sql = "aaaaaaaaaa{@}bbbbbbbbbb{@}ccccccc#cccccc"; //1 ...