創建型設計模式:Builder Pattern示例介紹

創建型設計模式:Builder Pattern示例介紹

在此之前,我們瞭解了工廠和抽象工廠模式。這些模式很有用。然而,有幾個案例需要創建一個非常複雜的對象,它需要不同的步驟和操作。在這種情況下,Builder Pattern設計模式非常有用。

創建型設計模式:Builder Pattern示例介紹

構建器Builder Pattern設計模式是一種創建型的設計模式,可用於逐步創建複雜的對象。

假設我們有一個具有許多依賴項的對象,並且需要獲取其中的每一個依賴項,就必須發出某些操作。在這種情況下,我們可以使用Builder模式來:

在一個單獨的構建器對象中封裝、創建和組裝複雜對象的各個部分。

將對象創建委託給構建器對象,而不是直接創建對象。

想象一下後端系統必須編寫和發送電子郵件的場景。

創建電子郵件可能是一個複雜的過程。您必須指定標題、設置收件人、添加問候語和添加結束語句。您也可能想使用mustache(http://mustache.github.io/)。不用說,有很多種選擇。

為創建電子郵件所需的所有操作設置一個類可能會使我們的類變得臃腫並失去其最初的目的。

因此,我們將從負責發送電子郵件的類開始。

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() { }}

如您所見,這個類只包含三個字符串字段,並且沒有額外的處理。因此,我們將創建一個builder類,該類將處理消息格式、接收方表示和電子郵件類的創建。

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(",",""); }}

下一步是使電子郵件創建更加嚴格,以便只能通過電子郵件生成器創建電子郵件。

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(",",""); } }}

使用Builder模式創建電子郵件的最終結果如下:

Email email = new Email.EmailBuilder() .addRecipient("[email protected]") .setMainText("Check the builder pattern") .setGreeting("Hi John!") .setClosing("Regards") .setTitle("Builder pattern resources") .build();

總之,通過使用Builder設計模式,我們能夠創建一個複雜的對象及其複雜的部分。

您可以在GitHub(https://github.com/gkatzioura/DesignPatterns)上找到源代碼。

創建型設計模式:Builder Pattern示例介紹


分享到:


相關文章: