建造者模式就是通过build方法创建出对象,可以有选择的给对象设置属性。
一般XxxBuilder就是使用了建造者模式定义的类。
创建一个User类,通过建造者模式创建出User对象。
package build;
/**
* 建造者模式
*/
public class User {
private String username;
private String password;
private String nickname;
private int age;
public User() {
}
public User(String username, String password, String nickname, int age) {
this.username = username;
this.password = password;
this.nickname = nickname;
this.age = age;
}
/**
* static作用是可以通过类名直接返回UserBuilder对象,如果这个方法不加static调用方式:new User().builder().username().age()...
* @return
*/
public static UserBuilder builder(){
return new UserBuilder();
}
/**
* XxxBuilder与Xxx类有相同的属性
*/
public static class UserBuilder{
private String username;
private String password;
private String nickname;
private int age;
private UserBuilder() {
}
//给对象设置属性值,返回当前对象
public UserBuilder username(String username) {
this.username = username;
return this;
}
public UserBuilder password(String password) {
this.password = password;
return this;
}
public UserBuilder nickname(String nickname) {
this.nickname = nickname;
return this;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
/**
* build方法将之前设置的值,放到构造中创建一个User对象。
* @return
*/
public User build(){
if (username == null || password == null) {
throw new RuntimeException("用户名和密码必填");
}
if (age <= 0 || age >= 150) {
throw new RuntimeException("年龄不合法");
}
// 还可以做赋予”默认值“的功能
if (nickname == null) {
nickname = username;
}
return new User(username,password,nickname,age);
}
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", nickname='" + nickname + '\'' +
", age=" + age +
'}';
}
}
调用测试
public class BuilderTest {
public static void main(String[] args) {
User user = User.builder()
.age(12)
.username("xiaoguang")
.password("123456")
.nickname("guang")
.build();
System.out.println(user);
}
}
通常建造者模式使用链式调用获取对象的方法很清晰,在最后build方法中可以有选择性的给对象设置属性,但是建造者模式中的Builder,通常和我们想要创建的对象的属性代码是重复的,例如上面的User和UserBuilder。
如果了解Lombok,可以直接使用Lombok的注解@Builder添加到实体类上,这样创建对象的时候,可以使用Build方法有选择性的设置属性值。
import lombok.Builder;
@Builder
public class User {
private String username;
private String password;
private String nickname;
private int age;
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", nickname='" + nickname + '\'' +
", age=" + age +
'}';
}
public static class UserTest {
public static void main(String[] args) {
User user = User.builder().age(100).username("student").nickname("hello").build();
System.out.println(user);
}
}
}
以上对建造者模式的了解就这么多,欢迎大家补充!
巨人的肩膀
javadoop.com