未使用Builder模式
假設(shè)有一個(gè)Student代表學(xué)生類歧胁,里面有很多屬性傅联,如下:
public class Student {
private int id;
private int age;
private int sex;
private float weight;
private String name;
private String major;
private String grade;
}
如果我們需要?jiǎng)?chuàng)建一個(gè)Student類,可能增加如下構(gòu)造方法:
public Student(int id, int age, int sex, float weight, String name, String major, String grade) {
this.id = id;
this.age = age;
this.sex = sex;
this.weight = weight;
this.name = name;
this.major = major;
this.grade = grade;
}
此時(shí)我們創(chuàng)建一個(gè)Student類:
Student student=new Student(1,25,0,120,"小明","Android","初級(jí)");
看到上面創(chuàng)建Student對(duì)象,是不是會(huì)覺(jué)得構(gòu)造方法中參數(shù)那么多加袋,他們分別代表什么呢盯蝴?是不是看起來(lái)很不清晰明了
使用Builder模式
下面將使用Builder模式來(lái)進(jìn)行改善:
- 在Student類中創(chuàng)建一個(gè)內(nèi)部靜態(tài)類Builder,該類包含Student中所有的屬性
public class Student {
public static class Builder{
private int id;
private int age;
private int sex;
private float weight;
private String name;
private String major;
private String grade;
...
}
}
- 為每個(gè)屬性創(chuàng)建一個(gè)類似setXXX的方法毅哗,但該方法返回值為Builder
public class Student {
public static class Builder{
...
public Builder id(int id){
this.id=id;
return this;
}
public Builder age(int age){
this.age=age;
return this;
}
...
}
}
- 在Student中創(chuàng)建一個(gè)包含Builder的私有構(gòu)造方法,并將Builder中的屬性賦值給對(duì)應(yīng)Student中的屬性
private Student(Builder builder){
this.id=builder.id;
this.age=builder.age;
this.sex=builder.sex;
this.weight=builder.weight;
this.name=builder.name;
this.major=builder.major;
this.grade=builder.grade;
}
- 在Builder中創(chuàng)建一個(gè)build()方法捧挺,該方法返回Student對(duì)象
public class Student {
public static class Builder{
...
public Student build(){
Student student=new Student(this);
return student;
}
...
}
}
使用Builder模式構(gòu)建一個(gè)Student對(duì)象
Student student=new Student.Builder()
.id(1)
.name("小明")
.age(18)
.sex(0)
.weight(120)
.major("Android")
.grade("初級(jí)")
.build();
總結(jié)
Builder設(shè)計(jì)模式將創(chuàng)建對(duì)象交給內(nèi)部類Builder,Builder類中含有外部類所需的屬性虑绵,Builder負(fù)責(zé)給外部類屬性賦值,從而來(lái)構(gòu)建外部類對(duì)象松忍。
從上面的對(duì)比看出蒸殿,使用Builder模式提高了代碼的可讀性,但是與此同時(shí)代碼量增加了不少鸣峭。
因此如果對(duì)于一個(gè)對(duì)象中有大量屬性的情況下宏所,使用Builder模式將大大提高代碼的可讀性。