使用场景:
1.构造函数参数非常多的情况,这种情况下,如果构造传入大量参数,程序的可读性会非常差
2.有一些构造函数的参数必须需要传入
创建思路:
1.现在通常做法是,在builder内部有一个内部类,这个负责创建需要的对象,然后将对象通过外部类的构造函数传进去,构造我们需要的builder类
2.这和典型的四人帮builder模式是有点不一样的,但设计模式不就是给个模板,然后让使用者自由发挥吗
代码:
1.builder主类
public class PlayerBuider {
private String firstName;
private String secondName;
private int age;
private String team;
private String address;
public PlayerBuider(KobeBuilder kobeBuilder) {
this.firstName = kobeBuilder.firstName;
this.secondName = kobeBuilder.secondName;
this.age = kobeBuilder.age;
this.team = kobeBuilder.team;
this.address = kobeBuilder.address;
}
public static class KobeBuilder {
private String firstName;
private String secondName;
private int age;
private String team;
private String address;
public KobeBuilder(String firstName, String secondName, int age) {
this.firstName = firstName;
this.secondName = secondName;
this.age = age;
}
public KobeBuilder setTeam(String team) {
this.team = team;
return this;
}
public KobeBuilder setAddress(String address) {
this.address = address;
return this;
}
public PlayerBuider buildePlayer() {
if (age < 10) {
throw new IllegalArgumentException(
"you must be kidding me!!,kobe bryant went to nba at ten");
}
return new PlayerBuider(this);
}
}
@Override
public String toString() {
return "firstName :" + this.getFirstName() + "---" + "secondName :" + this.getSecondName()
+ "---" + "age :" + this.getAge() + "---" + "team :" + this.getTeam() + "---"
+ "address :" + this.getAddress();
}
/**
* Getter method for property <tt>firstName</tt>.
*
* @return property value of firstName
*/
public String getFirstName() {
return firstName;
}
/**
* Setter method for property <tt>firstName</tt>.
*
* @param firstName value to be assigned to property firstName
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* Getter method for property <tt>secondName</tt>.
*
* @return property value of secondName
*/
public String getSecondName() {
return secondName;
}
/**
* Setter method for property <tt>secondName</tt>.
*
* @param secondName value to be assigned to property secondName
*/
public void setSecondName(String secondName) {
this.secondName = secondName;
}
/**
* Getter method for property <tt>age</tt>.
*
* @return property value of age
*/
public int getAge() {
return age;
}
/**
* Setter method for property <tt>age</tt>.
*
* @param age value to be assigned to property age
*/
public void setAge(int age) {
this.age = age;
}
/**
* Getter method for property <tt>team</tt>.
*
* @return property value of team
*/
public String getTeam() {
return team;
}
/**
* Setter method for property <tt>team</tt>.
*
* @param team value to be assigned to property team
*/
public void setTeam(String team) {
this.team = team;
}
/**
* Getter method for property <tt>address</tt>.
*
* @return property value of address
*/
public String getAddress() {
return address;
}
/**
* Setter method for property <tt>address</tt>.
*
* @param address value to be assigned to property address
*/
public void setAddress(String address) {
this.address = address;
}
}
2.client测试类
public class BuilderTest {
public static void main(String[] args) {
PlayerBuider.KobeBuilder kobe = new PlayerBuider.KobeBuilder("bryant", "kobe", 37);
PlayerBuider kobeBryant = kobe.setTeam("lakers").setAddress("la").buildePlayer();
System.out.println(kobeBryant.toString());
}
}
总结:
1.可以看到PlayerBuider里面有一个具体的KobeBuilder,它负责构造需要的类
2.构造完毕的KobeBuilder传入PlayerBuider的构造函数,返回我们使用的对象
3.在buildePlayer中可以对构造的对象进行一些校验
4.当PlayerBuider的属性相当多的时候,builder模式就会显现出它的价值,虽然这会增加一些方法实现和代码量,但相比较程序的可读性而言,这点牺牲绝对是可以接受的