Try Everything Different In My Life.

「🔨实践」使用构建器(Builder)来替代多个构造器

2019.03.19

在写一些通用工具类的时候,通常会有不同的配置,如果使用创痛的方式的话,需要重构多个构造器,使用构建器可以解决这样的问题。

Javanew这个关键字来创建对象,创建对象的细节我们写在构造器中。我们调用构造器来创建对象的时候可以依据传入的参数不同来控制创建对象的细节。

示例要求:

编写一个生成序列号的工具类,序列号是字符串类型,可以是UUID,可以是时间(如201901201536),可以是前缀+时间,可以是时间+后缀,可以是前缀+时间+后缀,并且以后根据需求可能还会进行扩展

传统方式(构造器重载)

public class Serial{
    private Type serialType;
    private String prefix;
    private String suffix;

    Serial(Type serialType){
        this.serialType = serialType;
    }

    Serial(String prefix,Type serialType){
        this.serialType = serialType;
        this.prefix = prefix;
    }

    Serial(Type serialType,String suffix){
        this.serialType = serialType;
        this.suffix = suffix;
    }

    Serial(String prefix,Type serialType,String suffix){
        this.serialType = serialType;
        this.prefix = prefix;
        this.suffix = suffix;
    }
}

传统方式缺点

  • 不能很好的扩展大量的参数
  • 代码很丑

Builder方式

public class Person {

	static Builder builder(String name){
		return new Builder().withName(name);
	}

	static class Builder{

		private String name;
		private int age;
		private String location;

		Builder withName(String name){
			this.name = name;
			return this;
		}

		Builder withAge(int age){
			this.age = age;
			return this;
		}

		Builder withLocation(String location){
			this.location = location;
			return this;
		}

		String generateperson(){
			return this.toString();
		}

		@Override
		public String toString() {
			return "Builder{" +"name='" + name + '\'' +", age=" + age +", location='" + location + '\'' +'}';
		}
	}
}

所有的对象创建工作都给Builder这个内部类去完成,使用代码如下:

 Person.builder("jaswine")
    .withAge(12)
    .withLocation("wuxi.jiangsu")
    .generateperson();

最后的结果是:

res

Tips:

第三方工具lombok实现了这个功能