Builder模式介绍
定义
将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建过程。
使用场景
当一个类的构造函数参数超过4个,而且这些参数有些是可选的参数,就可以考虑使用构造者模式
解决的问题
当一个类的构造函数参数超过4个,而且这些参数有些是可选的时,我们通常有两种办法来构建它的对象。 例如我们现在有如下一个类 分类 User
,其中name、phone与sex是必填参数,而其他3个是可选参数,那么我们如何构造这个类的实例呢,通常有两种常用的方式:
public class User {
private Long id;
//姓名
private String name;
//手机号
private String phone;
//性别 0 女 1 男
private String sex;
//身份证号
private String idNumber;
//头像
private String avatar;
}
- 创建不同的构造函数
- 使用各种set方法
两种方式在代码维护编写方面都及其浪费时间。
如何实现
- 在User中创建一个静态内部类 Builder,然后将User中的参数都复制到Builder类中。
- 在User中创建一个private的构造函数,参数为Builder类型
- 在Builder中创建设置函数,对User中那些可选参数进行赋值,返回值为Builder类型的实例
- 在Builder中创建一个
build()
方法,在其中构建User的实例并返回
public class User {
private Long id;
private String name;
private String phone;
private String sex;
private String idNumber;
private String avatar;
public static class Builder {
private Long id;
private String name;
private String phone;
private String sex;
private String idNumber;
private String avatar;
public Builder id(Long id){
this.id = id;
return this;
}
public Builder name(String name){
this.name = name;
return this;
}
public Builder phone(String phone){
this.phone = phone;
return this;
}
public Builder sex(String sex){
this.sex =sex;
return this;
}
public Builder idNumber(String idNumber){
this.idNumber = idNumber;
return this;
}
public Builder avatar(String avatar){
this.avatar = avatar;
return this;
}
public User build(){
return new User(this);
}
}
public static Builder builder(){
return new Builder();
}
public User(Builder builder){
this.id = builder.id;
this.name = builder.name;
this.phone = builder.phone;
this.avatar = builder.avatar;
this.idNumber = builder.idNumber;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
", sex='" + sex + '\'' +
", idNumber='" + idNumber + '\'' +
", avatar='" + avatar + '\'' +
'}';
}
}
public class test {
public static void main(String[] args) {
User user=User.builder()
.id(1L)
.name("张三")
.phone("123123123").build();
System.out.println(user);
}
}
评论区