A StringBuilder
ähnelt dem Builder-Muster, teilt jedoch nicht viel mit der GoF-Beschreibung dieses Entwurfsmusters. Der ursprüngliche Punkt des Entwurfsmusters war
Trennen Sie die Konstruktion eines komplexen Objekts von seiner Darstellung, damit derselbe Konstruktionsprozess unterschiedliche Darstellungen erstellen kann.
- von Design Patterns , von Gamma, Helm, Johnson, Vlissides.
(Hinweis: "komplex" bedeutet in erster Linie "aus mehreren Teilen zusammengesetzt", nicht unbedingt "kompliziert" oder "schwierig")
Die "verschiedenen Darstellungen" ist hier der Schlüssel. ZB unter der Annahme dieses Konstruktionsprozesses:
interface ArticleBuilder {
void addTitle(String title);
void addParagraph(String paragraph);
}
void createArticle(ArticeBuilder articleBuilder) {
articleBuilder.addTitle("Is String Builder an application of ...");
articleBuilder.addParagraph("Is the Builder Pattern restricted...");
articleBuilder.addParagraph("The StringBuilder class ...");
}
Es kann vorkommen, dass wir am Ende ein HtmlDocument
oder ein TexDocument
oder ein haben, MarkdownDocument
je nachdem, welche konkrete Implementierung bereitgestellt wird:
class HtmlDocumentBuilder implements ArticleBuilder {
...
HtmlDocument getResult();
}
HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();
Ein zentraler Punkt des Builder-Musters ist also der Polymorphismus . Das Design Patterns-Buch vergleicht dieses Muster mit der Abstract Factory:
Abstract Factory ähnelt dem Builder, da es auch komplexe Objekte erstellen kann. Der Hauptunterschied besteht darin, dass sich das Builder-Muster auf die schrittweise Erstellung eines komplexen Objekts konzentriert. […] Builder gibt das Produkt als letzten Schritt zurück, aber was die abstrakte Fabrik betrifft, wird das Produkt sofort zurückgegeben.
- von Design Patterns , von Gamma, Helm, Johnson, Vlissides.
Dieser schrittweise Aspekt ist dann zum populäreren Aspekt des Builder-Musters geworden, so dass das Builder-Muster im allgemeinen Sprachgebrauch so verstanden wird:
Teilen Sie die Konstruktion eines Objekts in mehrere Schritte auf. Auf diese Weise können wir benannte Argumente oder optionale Parameter auch in Sprachen verwenden, die diese Funktionen nicht unterstützen.
Wikipedia definiert das Muster folgendermaßen:
Das Builder-Muster ist ein Entwurfsmuster für eine Objekterstellungssoftware. Im Gegensatz zur Abstrakte Fabrik und das Factory - Methode Muster , deren Absicht ist Polymorphismus zu ermöglichen, ist die Absicht des Erbauers Musters ist eine Lösung für das Teleskop - Konstruktor anti-Muster zu finden [Bearbeiten] . […]
Das Builder-Muster hat einen weiteren Vorteil. Es kann für Objekte verwendet werden, die flache Daten enthalten (HTML-Code, SQL-Abfrage, X.509-Zertifikat ...), dh Daten, die nicht einfach bearbeitet werden können. Diese Art von Daten kann nicht schrittweise bearbeitet werden und muss sofort bearbeitet werden. Die beste Methode zum Erstellen eines solchen Objekts ist die Verwendung einer Builder-Klasse. [Zitat benötigt]
- aus Builder Pattern auf Wikipedia , von verschiedenen Mitwirkenden.
Wie wir sehen können, gibt es kein wirklich gemeinsames Verständnis, auf welches Muster sich dieser Name bezieht, und in einigen Punkten widersprechen sich sogar unterschiedliche Definitionen (z. B. hinsichtlich der Relevanz des Polymorphismus für Bauherren).
Die einzige gemeinsame Eigenschaft von StringBuilder
mit verschiedenen Interpretationen des Musters ist, dass das Produkt Schritt für Schritt und nicht in einem Zug erstellt wird. Die GoF-Definition des Entwurfsmusters wird nicht streng gelesen. Beachten Sie jedoch, dass es sich bei Entwurfsmustern um formbare Konzepte handelt, die die Kommunikation erleichtern sollen. Ich würde weiterhin StringBuilder
ein Beispiel für das Builder-Muster nennen, wenn auch ein atypisches - der Hauptgrund für diese Struktur in Java ist eine performante Verkettung bei unveränderlichen Zeichenfolgen, aber kein interessantes objektorientiertes Design.