日常开发中经常用到建造者设计模式,记录一下简单的构造形式
package com.google.builder;
/**
* @author : ♞Demons♛
* @date : 2020-01-04 17:21
* Description :
**/
public class FamilyBuilder {
private final String mother;
private final String father;
private final String sister;
private final String me;
public FamilyBuilder(String mother, String father, String sister, String me) {
this.mother = mother;
this.father = father;
this.sister = sister;
this.me = me;
}
public String getMother() {
return mother;
}
public String getFather() {
return father;
}
public String getSister() {
return sister;
}
public String getMe() {
return me;
}
public static class Builder {
private String mother;
private String father;
private String sister;
private String me;
public Builder mother(String mother) {
this.mother = mother;
return this;
}
public Builder father(String father) {
this.father = father;
return this;
}
public Builder sister(String sister) {
this.sister = sister;
return this;
}
public Builder me(String me) {
this.me = me;
return this;
}
public FamilyBuilder build() {
return new FamilyBuilder(mother, father, sister, me);
}
}
}
使用方式如下:
package com.google.builder;
/**
* @author : ♞Demons♛
* @date : 2020-01-04 17:00
* Description :
**/
public class Main {
public static void main(String[] args) {
FamilyBuilder familyBuilder = new FamilyBuilder.Builder()
.mother("m")
.father("f")
.sister("s")
.me("l")
.build();
System.out.println(familyBuilder.getMother());
System.out.println(familyBuilder.getFather());
System.out.println(familyBuilder.getSister());
System.out.println(familyBuilder.getMe());
}
}
注:为了显示效果,我在builder类中多加了getter方法,便于外部访问构造好的几个内部参数
在使用了IDEA的插件InnerBuilder
后发现了创建的另一种形式,构造时可选项如下:
自动生成的代码如下:
package com.google.builder;
/**
* @author : ♞Demons♛
* @date : 2020-01-04 17:33
* Description :
**/
public class AtomicBuilder {
private final String name;
private final String look;
private final int age;
private AtomicBuilder(Builder builder) {
name = builder.name;
look = builder.look;
age = builder.age;
}
public static final class Builder {
private String name;
private String look;
private int age;
public Builder() {
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder look(String look) {
this.look = look;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public AtomicBuilder build() {
return new AtomicBuilder(this);
}
}
}
对比后发现,主要区别是插件生成的代码中build()方法中在创建AtomicBuilder实例时采用的构造参数是对象,而我最上面的构造参数是具体的参数,相比之下插件生成的要简单一些,可以精简代码,NICE!