建造者模式是一种经典的设计模式,这里写一个简单的demo演示一下User.builder().xxx.xxx.build()链式编程爽爽的创建一个User对象的方法。建造者模式不仅用起来爽,而且可以省去domain类中存在大量属性时存在的大量有参构造方法,甚至只需要一个无参构造即可。
一.User类
package top.luoyongfu.domain;
/**
* 建造者模式测试
*/
public class User {
private Integer id;
private String name;
private String address;
private User() {
System.out.println("开始调用User自己的无参构造");
}
private User(User origin) {
System.out.println("开始调用User自己的有参构造");
this.id = origin.id;
this.name = origin.name;
this.address = origin.address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
public static User.Builder builder(){
return new User.Builder();
}
public static class Builder {
private User target;
public Builder() {//静态类的构造方法
System.out.println("我调用了User.Builder的构造方法?");
this.target = new User();
}
public Builder id(Integer id) {
target.id = id;
System.out.println("利用Builder进行了赋值id的工作");
return this;
}
public Builder name(String name) {
target.name = name;
System.out.println("利用Builder进行了赋值name的工作");
return this;
}
public Builder address(String address) {
target.address = address;
System.out.println("利用Builder进行了赋值address的工作");
return this;
}
public User build() {
System.out.println("完成构造,返回User对象,使用User自己的有参构造方法创建User对象");
return new User(target);
}
}
}
二.测试类
public class testBuilder {
@Test
public void testBuidlerBuild() {
User myBuildrBuild = User.builder()
.id(1)
.name("张三")
.address("成都")
.build();
System.out.println(myBuildrBuild);
}
}
三.结果如下
我调用了User.Builder的构造方法?
开始调用User自己的无参构造
利用Builder进行了赋值id的工作
利用Builder进行了赋值name的工作
利用Builder进行了赋值address的工作
完成构造,返回User对象,使用User自己的有参构造方法创建User对象
开始调用User自己的有参构造
User{id=1, name='张三', address='成都'}
自己进行测试之前,我感觉有很多疑问,测试之后,完全不知道有任何问题。
这里唯一的难点可能是最开始的User.build()方法,我们实际上是通过这个方法来获得静态类的对象,静态类对象在创建时会在自己的构造方法中创建一个空的User对象,然后我们再调用静态类中的各种方法给这个空的User对象赋值,赋值完毕后在返回给User自己创建对象。
有匿名内部类那味了。
甚至,你可以直接返回target而不是返回target给User
public User build() {
System.out.println("完成构造,直接返回User对象");
return target;
}
这样的话,连User类中的有参构造都不需要了。