构建Java实例通常有几种方式,1)通过构造方法创建,2)通过JavaBeans模式的getter/setter构建。一般情况下这2种方式没有什么问题,但是当参数非常多的时候,就会不够友好。
1)通过构造方法创建
当成员非常多的时候,会导致构造函数参数非常多,甚至部分成员是可选的时候,将会导致多个构造方法,并且这些方法非常难理解。
2)通过JavaBeans模式的getter/setter构建
这种方式缺少构造参数检查,并且使用setter导致了成员的可变性
使用Builder模式可以解决以上的问题
1)MessageBag实例无法被直接构建,必须通过MessageBag.Builder.build()方法构建
2)Builder的构造方法为实例的必须成员,其余方法设置可选成员
3)Builder方法可以进行成员验证,如果成员不符合规则,可以抛出IllegalArgumentException
public class MessageBag {
//required
private byte type;
//optional
private String message;
private String imageUrl;
private MessageBag(Builder builder) {
type = builder.type;
message = builder.message;
imageUrl = builder.imageUrl;
}
public byte getType() {
return type;
}
public String getMessage() {
return message;
}
public String getImageUrl() {
return imageUrl;
}
public static class Builder {
//required
private byte type;
//optional
private String message;
private String imageUrl;
public Builder(byte type) {
this.type = type;
}
public Builder message(String message) {
this.message = message;
return this;
}
public Builder imageUrl(String imageUrl) {
this.imageUrl = imageUrl;
return this;
}
public MessageBag build() {
return new MessageBag(this);
}
}
}
调用方式
import org.junit.Assert;
import org.junit.Test;
public class MessageBagTest {
@Test
public void builderTest() {
String message = "文本消息";
String imageUrl = "图片地址";
MessageBag.Builder builder = new MessageBag.Builder((byte) 1);
builder.message(message).imageUrl(imageUrl);
MessageBag msg = builder.build();
Assert.assertEquals(message, msg.getMessage());
Assert.assertEquals(imageUrl, msg.getImageUrl());
}
}
来源:CSDN
作者:loophome
链接:https://blog.csdn.net/loophome/article/details/104075514