之前在学习建造者模式的时候,我们也了解到,在构建不同形式和状态的对象最直接的方法就是构建多个构造方法,按照不同的场景进行不同的实例化操作,但如果类比较复杂的时候,需要的构造方法也会变多,我们可以使用建造者模式来避免这种情况。建造者模式还有一种写法方式,是使用内部建造者类和方法链的形式来代替构建多个构造方法。
方法链:是指通过特定的方法返回当前对象(this)的一种技术,通过这种技术,可以以链的形式调用方法。
例子如下:
1、定义一个Phone类,采用使用带方法链的内部建造者类的方式来实例化该Phone对象
package com.bran.builder.type1;
public class Phone {
private String cpu;
private String memory;
private String disk;
//Getter和Setter方法,为防止看着乱,我就省略写了
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", memory='" + memory + '\'' +
", disk='" + disk + '\'' +
'}';
}
//定义静态方法获取内部建造者类
public static Phone.Builder builder(){
return new Phone.Builder();
}
//私有化全参构造方法,提供给内部建造者类使用
private Phone(String cpu, String memory, String disk) {
this.cpu = cpu;
this.memory = memory;
this.disk = disk;
}
//内部建造者类,采用方法链式的写法
public static class Builder{
private String cpu;
private String memory;
private String disk;
public Builder cpu(String cpu) {
this.cpu = cpu;
return this;
}
public Builder memory(String memory) {
this.memory = memory;
return this;
}
public Builder disk(String disk) {
this.disk = disk;
return this;
}
//定义方法返回要建造的实例
public Phone build(){
return new Phone(cpu,memory,disk);
}
}
}
2、测试使用带方法链的内部建造者类来实例化Phone对象
package com.bran.builder.type1;
public class BuilderTest2 {
public static void main(String[] args) {
Phone phone = Phone.builder()
.cpu("骁龙855")
.memory("3g")
.disk("128g")
.build();
System.out.println(phone.toString());
}
}
3、 lombok包的@Builder注解也可以帮我们实现一个带方法链的内部建造者类的建造者模式,只需要在该实体类上加上@Builder注解就可以了,如下:
package com.bran.builder.type1;
import lombok.Builder;
import lombok.ToString;
@Builder
@ToString
public class Phone {
private String cpu;
private String memory;
private String disk;
}
加上这个@Builder注解就可以在编译过程中重新对Phone类中的代码构建,生成一个带有方法链的内部建造者类,我们就可以直接使用来实例化Phone对象了,实例化对象的测试代码跟上面第二步的一样。