建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

这种一步一步构造最终的对象的方式叫做 柯里化 (Currying)

概述


  • 意图:

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

  • 主要解决:

    主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;

    由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

    拆解产品的实现过程,让我联想到了敏捷开发。

  • 何时使用:

    一些基本部件不会变,而其组合经常变化的时候。

  • 如何解决:

    将变与不变分离开。

  • 关键代码:

    建造者:创建和提供实例

    导演:管理建造出来的实例的依赖关系。

  • 应用实例:

  1. 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
  2. JAVA 中的 StringBuilder。
  • 优点:
  1. 建造者独立,易扩展。
  2. 便于控制细节风险。
  • 缺点:
  1. 产品必须有共同点,范围有限制。
  2. 如内部变化复杂,会有很多的建造类。
  • 使用场景:
  1. 需要生成的对象具有复杂的内部结构。
  2. 需要生成的对象内部属性本身相互依赖。
  • 注意事项:

    与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

实现


public class Message {
private Integer id;
private String phone;
private String token;
private String verificationCode;
private Date verifiedAt;
private String ipAddress;
private Date createdAt;
private Date updatedAt; public Message() {
} public Message(String phone, String ipAddress, String token) {
this.phone = phone;
this.ipAddress = ipAddress;
this.token = token;
} public Message(String phone, String ipAddress, String token, String verificationCode) {
this.phone = phone;
this.ipAddress = ipAddress;
this.token = token;
this.verificationCode = verificationCode;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} .......... public static MessageBuilder builder() {
return new MessageBuilder();
} public static class MessageBuilder { private String phone; private String ipAddress; private String token; private String verificationCode; public MessageBuilder withPhone(String phone) {
this.phone = phone;
return this;
} public MessageBuilder withIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
return this;
} public MessageBuilder withToken(String token) {
this.token = token;
return this;
} public MessageBuilder withVerificationCode(String verificationCode) {
this.verificationCode = verificationCode;
return this;
} public Message build() {
return new Message(phone, ipAddress, token, verificationCode);
}
}
}

提示:如果是使用idea,可以利用构造方法,协助生成构造者模式

  1. 选中构造方法,点击右键
  2. 选择Refactor,打开子菜单
  3. 点击Replace Constructor With Builder...

设计模式学习心得<建造者 Builder>的更多相关文章

  1. 设计模式学习心得<代理模式 Proxy>

    在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 概述 意图 为其他对象提供 ...

  2. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  3. 设计模式学习之代理模式(Proxy,结构型模式)(11)

    参考地址:http://www.cnblogs.com/zhili/p/ProxyPattern.html 一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访 ...

  4. 设计模式学习之代理模式(Proxy)

    一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正 ...

  5. Java设计模式学习记录-代理模式

    代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

  6. 设计模式入门之代理模式Proxy

    //代理模式定义:为其它对象提供一种代理以控制对这个对象的訪问 //实例:鉴于书中给出的样例不太好.并且有些疑问,所以直接用保护代理作为实例 //要求,一旦订单被创建,仅仅有订单的创建人才干够改动订单 ...

  7. 学习笔记——代理模式Proxy

    代理模式,主要是逻辑和实现解耦.具体逻辑如何,由代理Proxy自己来设计,我们只需要把逻辑Subject交给代理即可. 主要应用场景,包括创建大开销对象时,使用代理来慢慢创建:远程代理,如网络不确定时 ...

  8. 《JAVA设计模式》之代理模式(Proxy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...

  9. javascript设计模式学习之六——代理模式

    一.代理模式定义 代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问.代理模式需要和本体对外提供相同的接口,对用户来说是透明的.代理模式的种类有 ...

  10. 设计模式学习心得<组合模式 Composite>

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

随机推荐

  1. jenkins使用(ubuntu16.0环境)

    本文总结了使用jenkins过程.大部分是网上链接,以后自已查看使用. ssh远程链接服务器 检查是否开启ssh   ps -ef|grep ssh 1.安装ssh 2.开启root用户 3.充许ro ...

  2. npm cnpm

    npm 1.说明: npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等) 2.使用npm安装插件:命令提示符执行npm ins ...

  3. Excel函数匹配查找

    需求 例如:北京沃尔玛有限公司,由已知的沃尔玛缩写,将两者进行匹配. 函数 lookup() 第一个参数“Lookup_value”:是要查找的值:第二个参数“lookup_vector”:是要查找的 ...

  4. Ubuntu16.04下安装OpenCV2.4.13

    软件版本 Ubuntu 16.04; OpenCV 2.4.13 安装步骤 1.首先安装一些编译工具 # 安装编译工具 sudo apt-get install build-essential # 安 ...

  5. LSTM/RNN中的Attention机制

    一.解决的问题 采用传统编码器-解码器结构的LSTM/RNN模型存在一个问题,不论输入长短都将其编码成一个固定长度的向量表示,这使模型对于长输入序列的学习效果很差(解码效果很差). 注意下图中,ax ...

  6. 把已经安装到C盘的软件完美移动到D盘

    背景信息 今天早上在安装软件的时候发现C盘爆满,只剩下最后10G了.而我要安装的玩意儿必须装到C盘. 靠清理垃圾文件来解决并不是一个好方法,实际上通常垃圾文件占用很少,而且就算清理了,也还会再出现. ...

  7. lecune入门示例

    注意:本示例中的lucene版本需在jdk7以上使用. 一.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  8. dubbo 支持的7种协议

    建议看原文 转自:https://blog.csdn.net/xiaojin21cen/article/details/79834222  1.dubbo 协议 (默认) 2.rmi 协议 3.hes ...

  9. JMeter处理返回结果unicode转码为中文

    问题举例: { "ServerCode":"200","ServerMsg":"\u6210\u529f"," ...

  10. window、location、location.href、self、top简单介绍

    1.self:当前窗口对象(如果是在iframe里,则为该框架的窗口对象) 2.top:父窗口对象 3.window:典型情况下,浏览器会为每一个打开的html创建对应的window对象,如果这个文档 ...