如果类的构造器或者静态工厂中具有多个参数,设计这种类时,建造者模式(Builder)是最好的选择;特别是大多数参数都是可选或者类型相同时.
与重叠构造器,建造者模式代码更易于阅读;
与javaBeans比更加安全(javaBeans在构造过程中javaBeans可能处于不一致的状态,把类做成不可变的可能性不复存在)
package com.builder;
/**
* @Authro: QYF
* @Time:2021/3/23 22:39
*/
public class User {
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String gender;
/**
* 年龄
*/
private Integer age;
/**
* 爱好
*/
private String hobby;
/**
* 身高
*/
private Integer height;
/**
* 构造器私有化
*/
private User(){}
public static getInstance(){
return new Builder();
}
public static class Builder{
private String name;
private String gender;
private Integer age;
private String hobby;
private Integer height;
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setGender(String gender) {
this.gender = gender;
return this;
}
public Builder setAge(Integer age) {
this.age = age;
return this;
}
public Builder setHobby(String hobby) {
this.hobby = hobby;
return this;
}
public Builder setHeight(Integer height) {
this.height = height;
return this;
}
public User builder(){
User user = new User();
user.name = this.name;
user.age = this.age;
user.hobby = this.hobby;
user.gender = this.gender;
user.height = this.height;
return user;
}
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
", hobby='" + hobby + '\'' +
", height=" + height +
'}';
}
}
package com.builder;
/**
* @Authro: QYF
* @Time:2021/3/23 23:00
*/
public class BuilderDemo {
public static void main(String[] args) {
User user = User.getInstance().setName("Tom").setAge(20).setGender("Man").builder();
System.out.println(user.toString());
}
}
输出结果:
User{name='Tom', gender='Man', age=20, hobby='null', height=null}