最近在看《effective-java》,在之前写代码的时候也遇到过同样的问题,就是有多个构造参数,但又不都是必须的,在我短而浅的编程经验中,自然像下面这么写啦:
public NutritionFacts(int s1, int s2){
//TO DO
}
public NutritionFacts(int s1, int s2,int s3){
//TO DO
}
public NutritionFacts(int s1, int s2,int s3,int s5){
//TO DO
}
然而看到了《effective-java》里的一段,觉得茅塞顿开,也是之前看过的设计模式 builder的实际使用场景吧,其中的具体建造者,抽象建造者,指导者都在代码里标明了,如下:
public class NutritionFacts {
private final int s1;//必须有的
private final int s2;//必须有的
private final int s3;
private final int fat;
private final int cal;
private NutritionFacts(Builder builder){
this.s1 = builder.s1;
this.s2 = builder.s2;
this.s3 = builder.s3;
this.fat=builder.fat;
this.cal=builder.cal;
}
public static void main(String[] arg){
//这句相当于指导者,constructor
NutritionFacts n=new Builder(10,12).buildCal(1).buildFat(22).buildS3(33).builds();
}
/**
* Builder用于产品的建造,只是少了一个抽象类,用于建造同种类型不能表现形式的产品
*/
public static class Builder{
private int s1;//必须有的
private int s2;//必须有的
private int s3=0;
private int fat=0;
private int cal=0;
public Builder(int s1,int s2){
this.s1=s1;
this.s2=s2;
}
public Builder buildS3(int s3){
this.s3=s3;
return this;
}
public Builder buildFat(int s3){
this.fat=s3;
return this;
}
public Builder buildCal(int s3){
this.cal=s3;
return this;
}
public NutritionFacts builds(){
return new NutritionFacts(this);
}
}
}