Design Pattern: Builder
Habe ich mich für eine gute Beispiel einer Builder pattern (in C#), kann aber nicht finden, entweder, weil ich nicht verstehe, das Builder pattern oder ich bin versucht, etwas zu tun, die nie vorgesehen war. Zum Beispiel, wenn ich zu einem abstrakten Automobil-und abstract-generator-Methoden zu erstellen, KFZ-Teile, ich sollte in der Lage sein zu senden alle 30 meine Entscheidungen an den Direktor, haben Sie bauen die Teile, die ich brauche, dann Baue mein Auto. Unabhängig davon, welches Auto, LKW, halb, etc. produziert, ich sollte in der Lage zu "fahren" Sie in genau der gleichen Weise.
Erste problem ist, die meisten Beispiele harte code-Eigenschaft Werte an der Beton-Teile, von denen ich wirklich denke, sollte aus einer Datenbank stammen. Ich dachte, die Idee war zu senden, dass meine Entscheidungen der Direktorin (aus einer Datenquelle) und haben die builder erstellen ein maßgeschneidertes Produkt, basierend auf meine Daten.
Zweite problem ist, ich will die builder-Methoden zu erschaffen, die wirklich die Teile dann weisen Sie Sie auf das Produkt, nicht pass strings, sondern real stark typisierten Produkt-Teile.
Zum Beispiel, ich möchte ein Formular erstellen, on the fly durch eine Builder-Herstellung von form-Feldern für mich, darunter ein label, einen Eingabe-Abschnitt, überprüfung, etc. Auf diese Weise kann ich Lesen das Objekt aus meiner ORM, check-out der Metadaten des Objekts verfügt, übergibt dieses an meine Builder und fügen Sie den neu erstellten Benutzer Steuern Ergebnis meiner web-Formular.
Doch jedes Builder-Beispiel finde ich nur hart codierte Daten, anstatt die Entscheidungen, die von der Haupt-code, um den generator und das Heraustreten ein maßgeschneidertes Produkt. Alles scheint eine große statische case-Anweisung. Zum Beispiel, wenn ich drei Parameter, die mit 10 Entscheidungen jeden, ich will nicht bauen, die 30 Beton-Builder Methoden, ich will nur genug, um die Herstellung, die Eigenschaften meines Produktes erfordert, die vielleicht nur drei.
Ich bin versucht zu haben, die Leiter gibt es in der Haupt-code nur. Es sollte ein Weg, um automatisch zu bestimmen, welche konkreten generator-Methode aufrufen, ähnlich wie Polymorphismus und Methode überlastungen (obwohl, dass ist ein sehr schlechtes Beispiel) anstelle der Verwendung einer case-Anweisung innerhalb der Muster. (Jedes mal muss ich hinzufügen ein neues Produkt geben, werde ich ändern müssen die vorhandenen Direktor, das ist schlecht).
InformationsquelleAutor der Frage Zachary Scott | 2009-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich beziehen sich auf das C# - Beispiel im Wikipedia-Artikel hier.
In diesem Fall würden Sie haben, Klasse Umsetzung PizzaBuilder, die weiß, wie man Daten aus einer Datenbank abzurufen. Sie können es mehrere Möglichkeiten.
Wäre eine HawaiianPizzaBuilder. Wenn die Klasse initialisiert wird, fragt es die Datenbank für eine Hawaii-Pizza und ruft der Reihe. Dann, wenn die verschiedenen Build(x) - Methoden aufgerufen, es würde die Eigenschaften festzulegen, um das entsprechende Feld der Datenbank abgerufen Zeile.
Anderen wäre macht einfach einen PizzaDatabaseBuilder und stellen Sie sicher, dass beim initialisieren der Klasse, die Sie, übergeben Sie die ID der Zeile, die Sie brauchen für diese Art von pizza. Zum Beispiel, anstatt
Verwenden Sie
Sollte nicht das Thema sein. Was Sie brauchen, ist eine andere Fabrik/Art Muster-generator initialisiert die Felder der Pizza. Zum Beispiel
statt
würden Sie etwas tun, wie
oder
DoughBuilder können gehen Sie zu einer anderen Tabelle in der Datenbank, um richtig füllen Sie ein PizzaDough Klasse.
InformationsquelleAutor der Antwort RS Conley
Meist der Aufruf einer BuilderPattern sieht wie folgt aus:
InformationsquelleAutor der Antwort Tobias
Ich habe nie darüber nachgedacht, es auf diese Weise, aber LINQ (das Muster, nicht die syntax) ist eigentlich ein generator, richtig?
Ist es ein fluent interface, baut eine Abfrage aus und können Abfragen erstellen, die in verschiedenen Darstellungen (SQL-in-memory-Objekt Abfragen, webservice Abfragen, Bart de Smet schrieb sogar eine Implementierung von Linq-to-Excel).
InformationsquelleAutor der Antwort Jörg W Mittag
Ich würde sagen, dass Sie nicht vermeiden können, die entweder diese - mit wenigen überladungen für Ihre Teile und mit einem case/if-Anweisung irgendwo unten im Stapel. Auch das ändern Sie Ihren code beim hinzufügen einer neuen Klasse könnte Ihre einzige option.
Dass gesagt wird, können Sie sich mit einigen anderen von draußen - nämlich die Fabrik, die helfen könnten Sie in den Prozess. Auch die sinnvolle Nutzung von Polymorphismus (z.B. alle Teile, die Erben, die irgendeine Art-sei es eine Klasse oder eine Schnittstelle) reduzieren die Menge an ifs/Fälle und überlastung.
Hoffe, das hilft.
InformationsquelleAutor der Antwort Rashack