一、场景描述
建造者模式同工厂模式、抽象工厂模式一样,用于创建继承类对象。
工厂模式:Java设计模式之工厂模式
抽象工厂模式:Java设计模式之抽象工厂模式
所不同的是,工厂模式下,各子类实现接口,通过工厂类创建子类对象;而建造者模式下,各子类拥有其建造者类,通过它创建不同的父类对象,最终实现多态,实际上子类、父类在代码中是不存在的。
以仪器数据采集工具为例,工厂模式下,定义接口“仪器数据采集工具”,定义子类“PDF文件数据采集工具”和“Excel文件数据采集工具”,子类实现接口。通过工厂类(无论是静态工厂类还是抽象工厂类),创建子类对象,这些对象拥有不同的表现方式,即为多态。
在建造者模式下,定义父类“仪器数据采集工具”,然后通过“PDF文件数据采集工具的建造者类”和“Excel文件数据采集工具的建造者类”来为“仪器数据采集工具”的类对象赋予不同的表现方式(为字段赋予不同的值等),最终实现多态。
建造者模式下,Director好比导演一般,它来调用建造者Builder完成对类对象的创建,调用者调用Director即可,如下图所示:
当然,工厂模式字面意义是用于创建对象,而建造者模式字面意义是建造不同的对象,两者能实现类似的功能,但两者的应用场景大可不同。
工厂模式应用于某简单类对象的创建,而建造者模式应用于复杂类对象的建造,具体可百度学习体会。
扩展时,例如新增Word文件数据采集,创建其Builder类即可,该类实现Word文件数据采集程序的创建工作;调用时使用WordBuilder类即可调用。
二、示例代码
(父)类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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;
}
}
|
建造者接口:
1
2
3
4
5
6
7
8
9
|
package lims.designpatterndemo.builderdemo;
public interface EquipmentDataCaptureBuilder {
//部件
void buildFilePath();
void buildEquipmentData();
//组装
EquipmentDataCapture buildEquipmentDataCapture();
}
|
PDF数据采集建造者类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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数据采集建造者:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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类,可以简单理解为导演类:
1
2
3
4
5
6
7
8
9
10
|
package lims.designpatterndemo.builderdemo;
public class EquipmentDataCaptureDirector {
public EquipmentDataCapture constructEqiupmentDataCapture(EquipmentDataCaptureBuilder builder){
builder.buildFilePath();
builder.buildEquipmentData();
EquipmentDataCapture capture = builder.buildEquipmentDataCapture();
return capture;
}
}
|
调用端示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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());
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/mahongbiao/p/8621591.html