Java使用Builder模式构造实例

时光怂恿深爱的人放手 提交于 2020-01-23 18:08:32

构建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());
	}
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!