作用:1.实现对象的属性动态配置,即想赋值几个属性就赋值几个属性。
2.不允许外部创建实例,对象一旦被创建不允许改变对象属性值。
3.此模式在创建数据库连接池普遍使用。如spring对mongodb支持的包中MongoClientOptions类。
代码:
package designModel.builder;
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private int age;
private String sex;
private String address;
private String mobile;
private User(UserBuilder build) {
this.name = build.name;
this.age = build.age;
this.sex = build.sex;
this.address = build.address;
this.mobile = build.mobile;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getSex() {
return sex;
}
public String getAddress() {
return address;
}
public String getMobile() {
return mobile;
}
public static UserBuilder getUserBuilder() {
return new UserBuilder();
}
public static class UserBuilder{
private String name;
private int age;
private String sex;
private String address;
private String mobile;
public UserBuilder name(final String name) {
this.name = name;
return this;
}
public UserBuilder age(final int age) {
this.age = age;
return this;
}
public UserBuilder sex(final String sex) {
this.sex = sex;
return this;
}
public UserBuilder address(final String address) {
this.address = address;
return this;
}
public UserBuilder mobile(final String mobile) {
this.mobile = mobile;
return this;
}
public User build() {
return new User(this);
}
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", sex=" + sex + ", address=" + address + ", mobile=" + mobile
+ "]";
}
public static void main(String[] args) {
User build = User.getUserBuilder().name("fdsafsda").age(12).address("fasdf").build();
System.out.println(build);
}
}
注意细节:1.私有的构造器,参数为作为builder的静态内部类。
2.对外提供static的getUserBuilder方法来创建builder。
3.只有get方法没有set方法,用以保证不能改变属性
4.builder的属性跟外部的属性一样,用来给属性赋值
5.builder提供build方法构建外部类对象