建造者模式 - 969251639/study GitHub Wiki
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定
项目场景:在发送微信公众号的模板消息时,往往都需要构建比较复杂的实例的对象,那么可以通过建造者模式简单化的创建该对象
- 实现具体的消息对象,包含三个部分
public class AicareMessage implements java.io.Serializable {
/**
* 消息ID
*/
private String msgId;
/**
* 消息发送对象
*/
private AicareMessageTo msgTo;
/**
* 消息体
*/
private Object msgBody;
...
}
- 私有化构造函数,使其只能通过以一定规则的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;
}
...
}
- 内部构建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);
}
}
...
}
- 使用
//build一个发送短信的message
AicareMessage aicareMessage = new AicareMessage.Builder().
msgTo(UserGroupEnum.XTY_CUSTOMER, MsgCategoryEnum.MSG_SHORT_MSG, jobEntity.getTaskMsg().getSms().getMobile()).msgBody(shortMsg).build();