建造者模式 - 969251639/study GitHub Wiki

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定

项目场景:在发送微信公众号的模板消息时,往往都需要构建比较复杂的实例的对象,那么可以通过建造者模式简单化的创建该对象

  1. 实现具体的消息对象,包含三个部分
public class AicareMessage implements java.io.Serializable {
	/**
	 * 消息ID
	 */
	private String msgId;
	
	/**
	 * 消息发送对象
	 */
	private AicareMessageTo msgTo;

	/**
	 * 消息体
	 */
	private Object msgBody;
        ...
}
  1. 私有化构造函数,使其只能通过以一定规则的Builder来创建
public class AicareMessage implements java.io.Serializable {
	/**
	 * 消息ID
	 */
	private String msgId;
	
	/**
	 * 消息发送对象
	 */
	private AicareMessageTo msgTo;

	/**
	 * 消息体
	 */
	private Object msgBody;

        private AicareMessage(Builder builder) { 
            this.msgId = UuidGenUtils.genUUID();
            this.msgTo = builder.msgTo;
            this.msgBody = builder.msgBody;
        }
        ...
}
  1. 内部构建Builder,创建AicareMessage对象
public class AicareMessage implements java.io.Serializable {
	/**
	 * 消息ID
	 */
	private String msgId;
	
	/**
	 * 消息发送对象
	 */
	private AicareMessageTo msgTo;

	/**
	 * 消息体
	 */
	private Object msgBody;

        private AicareMessage(Builder builder) { 
            this.msgId = UuidGenUtils.genUUID();
            this.msgTo = builder.msgTo;
            this.msgBody = builder.msgBody;
        }

        public static class Builder {
    	    private AicareMessageTo msgTo;//发送给谁
    	    private Object msgBody;//发送内容

            public Builder msgTo(UserGroupEnum userGroup, MsgCategoryEnum category, String user) {
        	AicareMessageTo msgTo = new AicareMessageTo(userGroup, category, user);
                this.msgTo = msgTo;
                return this;
            }
        
            public Builder msgTo(UserGroupEnum userGroup, MsgCategoryEnum category, String publicAccount, String user) {
        	AicareMessageTo msgTo = new AicareMessageTo(userGroup, category, publicAccount, user);
                this.msgTo = msgTo;
                return this;
            }
            ...

            public Builder msgBody(MsgBody msgBody) {
                this.msgBody = msgBody;
                return this;
            }

            public AicareMessage build() {//构造AicareMessage实例
                return new AicareMessage(this);
            }
        }
        ...
}
  1. 使用
//build一个发送短信的message
AicareMessage aicareMessage = new AicareMessage.Builder().
					msgTo(UserGroupEnum.XTY_CUSTOMER, MsgCategoryEnum.MSG_SHORT_MSG, jobEntity.getTaskMsg().getSms().getMobile()).msgBody(shortMsg).build();