Beschränkt sich das Muster "Builder" auf die Adressierung des Anti-Musters "Teleskopkonstruktor", oder kann es auch auf das allgemeinere Problem der komplizierten Erstellung unveränderlicher Objekte angewendet werden?
Die StringBuilder
Klasse hat das Wort "Builder" im Namen, hat jedoch nichts mit Teleskopkonstruktoren zu tun. Sie hilft uns lediglich dabei, alle Daten zu sammeln, die wir zum Konstruktor eines unveränderlichen Objekts weitergeben müssen.
Für mich scheint die Antwort ein sehr klares "Ja" zu sein, aber es scheint einige Meinungsverschiedenheiten bezüglich des Themas zu geben, und ich hatte gehofft, dass jemand es vielleicht klären könnte.
Ich beantwortete diese Frage: Programmierer SE: Legitime "echte Arbeit" in einem Konstruktor? Wo das OP ein (vermutlich unveränderliches) Objekt erstellen möchte, das einen komplexen Baum enthält, und die Idee des "Builder" -Musters auftauchte, fand ich während der Recherche dieses Q & A, das zu sagen scheint, dass der "StringBuilder" -Stil der Objekterstellung ist nicht eine Anwendung des Musters „Builder“, aus Gründen , die mir nicht klar sind: Stackoverflow - Stringbuilder und Builder - Muster . (Diejenigen, die diese Frage beantworteten, konnten, soweit ich das beurteilen kann, nicht überzeugen.)
quelle
StringBuilder
scheint ein zugrunde liegendes Zeichenarray zu verwenden, um den String darzustellen, und ermöglicht es Ihnen, Dinge wie Einfügungen und Entfernungen an jedem Punkt durchzuführen. Letztendlich denke ich, dass StringBuilder eine Problemumgehung für unveränderliche String-Objekte ist, aber es sieht für mich ansonsten so aus, als würde es die Absicht des Builder-Musters erfüllen.Antworten:
A
StringBuilder
ähnelt dem Builder-Muster, teilt jedoch nicht viel mit der GoF-Beschreibung dieses Entwurfsmusters. Der ursprüngliche Punkt des Entwurfsmusters war(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:
Es kann vorkommen, dass wir am Ende ein
HtmlDocument
oder einTexDocument
oder ein haben,MarkdownDocument
je nachdem, welche konkrete Implementierung bereitgestellt wird:Ein zentraler Punkt des Builder-Musters ist also der Polymorphismus . Das Design Patterns-Buch vergleicht dieses Muster mit der Abstract Factory:
Dieser schrittweise Aspekt ist dann zum populäreren Aspekt des Builder-Musters geworden, so dass das Builder-Muster im allgemeinen Sprachgebrauch so verstanden wird:
Wikipedia definiert das Muster folgendermaßen:
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 weiterhinStringBuilder
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.quelle