构建器设计模式

以前我们看过工厂和抽象工厂模式。 这些模式可以达到目的,并且确实有用,但是在某些用例中,我们必须创建一个非常复杂的对象,并且创建它需要不同的步骤,每个步骤都需要不同的操作。 在这种情况下,构建器模式可能非常有用。
构建器设计模式是一种创新设计模式,可用于逐步创建复杂对象。

假设我们有一个具有许多依赖关系的对象,并且为了获取每个依赖关系,必须执行某些特定的操作。
在这种情况下,我们可以使用构建器模式

  • 将复杂对象的各个部分的创建和组装封装在一个单独的Builder对象中。
  • 将对象创建委托给Builder对象,而不是直接创建对象。

想象一下后端系统必须撰写和发送电子邮件的情况。
创建电子邮件可能是一个复杂的过程。 您必须指定标题,设置收件人,添加问候语和结束语。 您可能还想使用小胡子 。 有多种选择。

创建电子邮件所需的所有操作都只有一个班级,这可能会使我们的班级肿并失去其初衷。

因此,我们将从负责发送电子邮件的类开始。

package com.gkatzioura.design.creational.builder;public class Email {private final String title;private final String recipients;private final String message;public Email(String title, String recipients, String message) {this.title = title;this.recipients = recipients;this.message = message;}public String getTitle() {return title;}public String getRecipients() {return recipients;}public String getMessage() {return message;}public void send() {}
}

如您所见,该类仅包含三个字符串字段,并且对它们没有任何额外的处理。 因此,我们将创建一个构建器类,该类将处理消息格式,收件人表示形式和Email类的创建。

package com.gkatzioura.design.creational.builder;import java.util.HashSet;
import java.util.Set;public class EmailBuilder {private Set recipients = new HashSet();private String title;private String greeting;private String mainText;private String closing;public EmailBuilder addRecipient(String recipient) {this.recipients.add(recipient);return this;}public EmailBuilder removeRecipient(String recipient) {this.recipients.remove(recipient);return this;}public EmailBuilder setTitle(String title) {this.title = title;return this;}public EmailBuilder setGreeting(String greeting) {this.greeting = greeting;return this;}public EmailBuilder setMainText(String mainText) {this.mainText = mainText;return this;}public EmailBuilder setClosing(String closing) {this.closing = closing;return this;}public Email create() {String message = greeting+"\n"+mainText+"\n"+closing;String recipientSection = commaSeparatedRecipients();return new Email(title,recipientSection,message);}private String commaSeparatedRecipients() {StringBuilder sb = new StringBuilder();for(String recipient:recipients) {sb.append(",").append(recipient);}return sb.toString().replaceFirst(",","");}}

下一步是使电子邮件创建更加严格,以便只能通过EmailBuilder创建电子邮件。

package com.gkatzioura.design.creational.builder;import java.util.HashSet;
import java.util.Set;public class Email {private final String title;private final String recipients;private final String message;private Email(String title, String recipients, String message) {this.title = title;this.recipients = recipients;this.message = message;}public String getTitle() {return title;}public String getRecipients() {return recipients;}public String getMessage() {return message;}public void send() {}public static class EmailBuilder {private Set recipients = new HashSet();private String title;private String greeting;private String mainText;private String closing;public EmailBuilder addRecipient(String recipient) {this.recipients.add(recipient);return this;}public EmailBuilder removeRecipient(String recipient) {this.recipients.remove(recipient);return this;}public EmailBuilder setTitle(String title) {this.title = title;return this;}public EmailBuilder setGreeting(String greeting) {this.greeting = greeting;return this;}public EmailBuilder setMainText(String mainText) {this.mainText = mainText;return this;}public EmailBuilder setClosing(String closing) {this.closing = closing;return this;}public Email build() {String message = greeting+"\n"+mainText+"\n"+closing;String recipientSection = commaSeparatedRecipients();return new Email(title,recipientSection,message);}private String commaSeparatedRecipients() {StringBuilder sb = new StringBuilder();for(String recipient:recipients) {sb.append(",").append(recipient);}return sb.toString().replaceFirst(",","");}}
}

使用构建器模式创建电子邮件的最终结果将是这样。

Email email = new Email.EmailBuilder().addRecipient("john@Doe.com").setMainText("Check the builder pattern").setGreeting("Hi John!").setClosing("Regards").setTitle("Builder pattern resources").build();

总而言之,通过使用构建器模式,我们能够创建一个复杂的对象及其复杂的部分。

您可以在github上找到源代码。

在下一个博客中,我们将讨论单例模式。

另外,我还编写了备忘单,其中包含“创作设计模式”的摘要。
在链接中注册以接收它。

翻译自: https://www.javacodegeeks.com/2018/03/creational-design-patterns-builder-pattern.html

构建器设计模式

构建器设计模式_创新设计模式:构建器模式相关推荐

  1. 抽象工厂模式设计模式_创新设计模式:抽象工厂模式

    抽象工厂模式设计模式 抽象工厂模式是一种创新模式,是与构建器和工厂模式一起最受欢迎的模式之一. 使用创建模式是为了创建对象,而不是直接使用构造函数创建对象. 抽象工厂模式提供了一种封装一组具有共同主题 ...

  2. 创建父需求子需求构建需求树_用pc构建DIY计算集群(超级计算机)

    ----------------------------------------------------------------- 用pc构建DIY计算集群 目录 /构建计算集群 0. |-- /0前 ...

  3. glide源码中包含了那种设计模式_秒懂设计模式之建造者模式(Builder pattern)

    更新于2020年10月20日 没想到这篇设计模式的文章引起了如此多小伙伴的兴趣,本人近来一直在使用kotlin,某天突然好奇当Builder模式遇到Kotlin会怎样,还有爱吗,欢迎好学的小伙伴一起探 ...

  4. mesh 协调器 路由器_双模网络协调器、双模路由器、双模mesh组网系统及其方法与流程...

    本发明涉及mesh组网领域,特别涉及双模网络协调器.双模路由器.双模mesh组网系统及其方法. 背景技术: 无线mesh是一种非常适合于覆盖大面积开放区城(包括室外和室内)的无线区域网络解决方案.无线 ...

  5. .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  6. mesh 协调器 路由器_关于zigbee协调器(单播方式)传输数据给网络中的多个路由器丢失数据包的问题?...

    问题描述:建立一个mesh网络,网络中只存在协调器和路由器节点,并不存在Endevice终端节点.整个网络大概存在20多个路由节点,一个协调器. 路由器节点和协调器都加入和NV存储,所以路由节点掉电后 ...

  7. netflix 模式创新_创新设计模式:工厂模式

    netflix 模式创新 以前,我们对创建模式进行了介绍,并使用抽象工厂模式来创建对象族. 下一个模式是Factory模式 . 当涉及到Java时,工厂模式是最常用的模式之一. 那么工厂模式到底是什么 ...

  8. netflix 模式创新_创新设计模式:单例模式

    netflix 模式创新 单例设计模式是一种软件设计模式,用于将类的实例化限制为一个对象. 与其他创建设计模式(例如抽象工厂 , 工厂和构建器模式)相比,单例将创建一个对象,但也将负责,因此该对象只有 ...

  9. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

最新文章

  1. I00031 Look-and-say sequence
  2. Python零基础学习代码实践 —— 提取字符串里面的单词数
  3. 使用个推的时候出现Installation error: INSTALL_FAILED_DUPLICATE_PERMISSION
  4. 服务器t4卡在哪个位置,英特尔(Intel )X710-T4融合网络适配器4口万兆X710T4服务器网卡...
  5. 自定义php报错信息,自定义PHP的错误报告处理方式
  6. 边缘设备上的实时AI人员检测:入门
  7. 攻克机器学习硕士学位,我的那些年与必备技能!
  8. 博客生活的另一种境界![博友话题]
  9. python中的and_我想问下python中 逻辑与:“”和“and”的区别
  10. What is Closure
  11. Android TouchEvent事件传递机制
  12. 阿里巴巴小程序繁星计划专题上线,汇集最优扶持资源与最新资讯!
  13. 小米手机html格式怎么打开,小米手机打开HTML用WPS
  14. GD32 startup.s
  15. 11款网站死链检测工具
  16. java面向对象怎样建类和对象_java面向对象(上)-- 类与对象、类的封装
  17. (干货分享)如何下载网站上的视频
  18. YOYOW-WeCenter特别版免费开源发布,一小时建立你的问答社区
  19. Oracle EBS MRP模块之预测冲减
  20. 时光穿梭机(撤销修改)

热门文章

  1. 一二三系列之状压DP——Max Correct Set(一)Neko Rules the Catniverse (Large Version)(二)Make It Ascending(三)
  2. 模板:min-max容斥离散随机变量的几何分布(洛谷P3175:[HAOI2015]按位或)
  3. YBTOJ:字符串题(KMP)
  4. P3308-[SDOI2014]LIS【最小割】
  5. P6088-[JSOI2015]字符串树【可持久化Trie,LCA】
  6. codeforces1494 D. Dogeforces(构造)
  7. 【数论】ZAP-Queries(P3455)
  8. 【枚举】LAGNO(jzoj 1149)
  9. Codeforces 786B Legacy (线段树优化建图)
  10. codeforces 935E Fafa and Ancient Mathematics 语法树、动态规划