一、建设者模式
Separate the construction of a complex object from it's representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
二、应用场景
通常我们遇到如下的场景,对于一组个产品,可能具有相同的参数或者功能,但是有的参数是非必须的或者功能的顺序不一致,对于这样的场景,我们可以使用建造者模式来实现。建设者模式也称为生产者模式
三、角色
建设者模式中一般分为四个角色:
产品类:抽象建造者具体建造者执行类
四、模式实例
最近在项目中需要组装发送消息的功能,不同的消息发送需要用到不同的参数,但是起送发送方和接收方是必须的。在项目过程中可能根据情况来发送不同的消息参数。
本案例结合工作中涉及到的功能来说明建造者模式,存在过度设计的问题,大家阅读只需要知道建造者模式的具体用法,然后根据实际需要自己进行设计即可
分析这个需求,我首先封装发送消息的所有参数,并且使用构建器来初始化发送的实例对象
/** * 发送数据模型 */public class SendData { /** * 类型标志 */ private String tag; /** * 发送方 */ private String intcEnte; /** * 接收方 */ private String relaEnte; /** * 发送时间 */ private Date cretime; /** * 发送内容 */ private String content; /** * 是否需要回调 */ private boolean isCallback; /** * 发送的类型 */ private String type; public static class Builder{ /** * 类型标志 */ private String tag; /** * 发送方 */ private String intcEnte; /** * 接收方 */ private String relaEnte; /** * 发送时间 */ private Date cretime = new Date(); /** * 发送内容 */ private String content; /** * 是否需要回调 */ private boolean isCallback; /** * 发送的类型 */ private String type; public Builder(String intcEnte,String relaEnte){ this.intcEnte = intcEnte; this.relaEnte = relaEnte; } public Builder tag(String tag){ this.tag = tag; return this; } public Builder content(String content){ this.content = content; return this; } public Builder isCallback(boolean isCallback){ this.isCallback = isCallback; return this; } public Builder type (String type){ this.type = type; return this; } public SendData builde(){ return new SendData(this); } } public SendData(Builder builder){ this.content = builder.content; this.cretime = builder.cretime; this.intcEnte = builder.intcEnte; this.relaEnte = builder.relaEnte; this.isCallback = builder.isCallback; this.type = builder.type; this.tag = builder.tag; }}
此处过度设计,并且引入模板模式来优化建造者模式。
/** * 数据发送 抽象建造者 */public interface SendDataBuilder { SendData getSendData();}
/** * 扩展发送数据 具体建设者 */public class ExtendSendData implements SendDataBuilder { private SendData sendData; public ExtendSendData(String intcEnte,String relaEnte,String content){ sendData = new SendData.Builder(intcEnte,relaEnte).content(content).builde(); } @Override public SendData getSendData() { return sendData; }}
/** * 基本发送数据 具体建设者 */public class BaseSendData implements SendDataBuilder { private SendData sendData; public BaseSendData(String intcEnte,String relaEnte){ sendData = new SendData.Builder(intcEnte,relaEnte).builde(); } @Override public SendData getSendData() { return sendData; }}
/** * 执行者 */public class Exec { private SendDataBuilder builder; public SendData getBaseSendData(String intcEnte,String relaEnte){ builder = new BaseSendData(intcEnte,relaEnte); return builder.getSendData(); } public SendData getExtendData(String intcEnte,String relaEnte,String content){ builder = new ExtendSendData(intcEnte,relaEnte,content); return builder.getSendData(); }}
上述的例子,只是为了说明建造者模式的使用方法,实际开发过程中需要考虑到业务的需要,并且针对进行设计。总结: 相同方法或者参数,不通的执行顺序,产生不同的事件结果,可以使用建造者模式