博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构建者模式
阅读量:6713 次
发布时间:2019-06-25

本文共 3551 字,大约阅读时间需要 11 分钟。

一、建设者模式

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();    }}
上述的例子,只是为了说明建造者模式的使用方法,实际开发过程中需要考虑到业务的需要,并且针对进行设计。总结: 相同方法或者参数,不通的执行顺序,产生不同的事件结果,可以使用建造者模式

转载于:https://www.cnblogs.com/amoszhu/p/9668859.html

你可能感兴趣的文章
图像滤镜艺术---Glow Filter发光滤镜
查看>>
[离散时间信号处理学习笔记] 14. 多采样率信号处理
查看>>
create-react-app 引入 antd 及 解决 antd 样式无法显示的bug
查看>>
获取图形验证码
查看>>
值得 .NET 开发者了解的15个特性
查看>>
Fresco-Facebook的图片加载框架的使用
查看>>
Android Runtime Stats
查看>>
InstallShield卸载状态
查看>>
CentOS7 修改主机名
查看>>
小工具:天气查询 Vs自定义设置 DevGridControl中GridView排序问题 小工具:火车票查询 小工具:邮件发送 小工具:截图&简单图像处理...
查看>>
11.QT-布局管理器(Box,Grid,Form,Stacked)
查看>>
用 Anaconda 完美解决 Python2 和 python3 共存问题
查看>>
易语言飞扬学习
查看>>
Android 自定义Android ORM 框架greenDAO数据库文件的路径
查看>>
python程序打包成.exe
查看>>
oc懒加载 & swift lazy
查看>>
CUDA 编程的基本模式
查看>>
git命令行解决冲突文件步骤
查看>>
List、Map、Set三个接口,存取元素时,各有什么特点?
查看>>
js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写
查看>>