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