一。适用场景:构造比较复杂的对象。这种场景需要两个类:一个类是原始类,另一个是构建者类,用于构建原始类的对象。比如,一个Computer类,一个ComputerBuilder类,用于构建Computer类对象。
二。常用的两种方式:
1。原始类和构建者类为独立的类。
2。构建者类为原始类的内部静态类。
三。第二种方式的常用写法
例如Computer类,该类有2个属性cpu和memory,首先按照通常的方法定义该类,示例代码如下:
package cn.edu.tju.app;
public class Computer {
private String cpu;
private String memory;
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 ComputerBuilder builder(){
return new ComputerBuilder();
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", memory='" + memory + '\'' +
'}';
}
}
然后在该类内部增加内部静态类,示例代码如下:
static class ComputerBuilder{
private Computer computer=new Computer();
public ComputerBuilder buildCpu(String cpuInfo){
computer.setCpu(cpuInfo);
return this;
}
public ComputerBuilder buildMemory(String memoryInfo){
computer.setMemory(memoryInfo);
return this;
}
public Computer build(){
return computer;
}
}
该内部静态类有一个private 的Computer对象,然后提供相应的public 方法,用来构建Computer类对象的各个部分,最后通过build()方法可返回其持有的Computer类对象。
使用示例如下:
package cn.edu.tju.app;
public class BuilderTest {
public static void main(String[] args) {
Computer computer=new Computer().builder()
.buildCpu("intel i7")
.buildMemory("16 G")
.build();
System.out.println(computer);
}
}
然后需要在Computer类中定义一个public 的方法,用于返回构建者类对象:
public ComputerBuilder builder(){
return new ComputerBuilder();
}
使用的时候,首先构建者内部通过builder()方法返回静态类对象,
new Computer().builder()
接下来分别调用构建者类的public 方法,分别构建Computer类对象的各个部分,最后调用build()方法返回所构建的对象,就可以使用所返回的对象了。
Computer类的完整定义如下:
package cn.edu.tju.app;
public class Computer {
private String cpu;
private String memory;
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 ComputerBuilder builder(){
return new ComputerBuilder();
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", memory='" + memory + '\'' +
'}';
}
static class ComputerBuilder{
private Computer computer=new Computer();
public ComputerBuilder buildCpu(String cpuInfo){
computer.setCpu(cpuInfo);
return this;
}
public ComputerBuilder buildMemory(String memoryInfo){
computer.setMemory(memoryInfo);
return this;
}
public Computer build(){
return computer;
}
}
}