构建器设计模式
以前我们看过工厂和抽象工厂模式。 这些模式可以达到目的,并且确实有用,但是在某些用例中,我们必须创建一个非常复杂的对象,并且创建它需要不同的步骤,每个步骤都需要不同的操作。 在这种情况下,构建器模式可能非常有用。
构建器设计模式是一种创新设计模式,可用于逐步创建复杂对象。
假设我们有一个具有许多依赖关系的对象,并且为了获取每个依赖关系,必须执行某些特定的操作。
在这种情况下,我们可以使用构建器模式
- 将复杂对象的各个部分的创建和组装封装在一个单独的
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
构建器设计模式