生成器模式
生成器模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
这么看起来我反正是理解不了,直接上例子
public class Phone {
private String name;
private String ram;
private String rom;
private String cpu;
Phone(){
this(new Builder());
}
Phone(Builder builder){
this.name = builder.name;
this.ram = builder.ram;
this.rom = builder.ram;
this.cpu = builder.cpu;
}
public String getName() {
return name;
}
public String getRam() {
return ram;
}
public String getRom() {
return rom;
}
public String getCpu() {
return cpu;
}
@Override
public String toString() {
return "Phone{" +
"name='" + name + '\'' +
", ram='" + ram + '\'' +
", rom='" + rom + '\'' +
", cpu='" + cpu + '\'' +
'}';
}
public static class Builder{
private String name;
private String ram;
private String rom;
private String cpu;
Builder(){
}
Builder(Phone phone){
this.name = phone.name;
this.ram = phone.ram;
this.rom = phone.rom;
this.cpu = phone.cpu;
}
public Builder setName(String name){
this.name = name;
return this;
}
public Builder setRam(String ram){
this.ram = ram;
return this;
}
public Builder setRom(String rom){
this.rom = rom;
return this;
}
public Builder setCpu(String cpu){
this.cpu = cpu;
return this;
}
public Phone build(){
return new Phone(this);
}
}
}
调用
Phone phone = new Phone.Builder()
.setName("mi10")
.setRam("6g")
.setRom("256g")
.setCpu("855")
.build();
System.out.println(phone);
// Phone{name='mi10', ram='6g', rom='6g', cpu='855'}
根据代码来看,定义是说把一个复杂对象的构建与表示分离,上面代码里的Phone类就是所说的复杂对象,该对象是由内部类Builder执行bulid()来构建的,Phone没有任何set方法,只有get方法,这就是构建与表示分离,接下来是同样的构建过程可以创建不同的表示,这段话我觉得没有特殊的含义,就像同一个函数传入的参数不同得出的结果自然可能不同。
下面我们来看看用别的方式完成这个功能
Phone phone = new Phone()
phone.setName("mi10")
phone.setRam("6g")
phone.setRom("256g")
phone.setCpu("855")
System.out.println(phone);
// Phone{name='mi10', ram='6g', rom='6g', cpu='855'}
这里的Phone就是一个简单得pojo对象,我们经常也会做这种操作,但是如果属性比较多的话,这样操作看起来就不是十分的优雅,比不上链式调用看起来简洁。而且考虑在多个进程同时使用这个对象的情况下,如果别的线程正在set属性值,然后另一个线程读取了,这就会导致信息不全,如果使用生成器模式,对属性的操作都在builder对象里,只有在build之后才会给Phone对象赋值,所以不会发生这种情况。
Phone phone = new Phone("mi10","6g","256g","855")
System.out.println(phone);
// Phone{name='mi10', ram='6g', rom='6g', cpu='855'}
当然我们也可以用构造函数实现,但是如果属性一多,为了满足多种参数需求,那就需要多重构造函数,想想就有点害怕,而且参数位置还是固定的不是很自由。
总结
以上就是我对生成器模式的理解,复杂对象负责表示,内部类builder负责创建对象。