822 Stimmen

Was ist der Unterschied zwischen Builder Design Pattern und Factory Design Pattern?

Was ist der Unterschied zwischen dem Builder-Entwurfsmuster und dem Factory-Entwurfsmuster?

Welche ist vorteilhafter und warum?

Wie stelle ich meine Ergebnisse als Diagramm dar, wenn ich diese Muster testen und vergleichen/gegenüberstellen möchte?

14 Stimmen

Da sie unterschiedliche Dinge tun, was meinen Sie mit "vorteilhaft"?

8 Stimmen

Bauherr ist eine komplexere Version von Konstrukteur - während Fabrikmethode ist eine vereinfachte Version.

0 Stimmen

@DávidHorváth Ich würde einen Builder nicht als "komplexer" bezeichnen. Wenn man es mit einem Konstruktor zu tun hat, der 100 Parameter hat, und man sich nur für 3 davon interessiert, und man weiß, dass sich die Anzahl der Parameter in der Zukunft ändern könnte, würde die Verwendung des Builder-Musters das Leben aller Beteiligten sehr viel einfacher machen.

36voto

Premraj Punkte 65511

Bauherr

Fabrik

Nur eine Instanz zurückgeben, um komplexe Objektkonstruktionen zu handhaben

Verschiedene Instanzen bei mehreren Konstruktoren zurückgeben

Keine Schnittstelle erforderlich

Schnittstellengesteuert

Innere Klassen sind beteiligt (um teleskopische Konstruktoren zu vermeiden)

Unterklassen sind beteiligt

Teleskopierende Konstrukteur-Muster

Analogie:

  • Fabrik: Nehmen wir ein Restaurant. Die Erstellung des "heutigen Essens" ist ein Fabrikmuster, denn Sie sagen der Küche: "Holen Sie mir das heutige Essen", und die Küche (Fabrik) entscheidet auf der Grundlage verborgener Kriterien, welches Objekt erstellt werden soll.
  • Erbauer: Der Erbauer erscheint, wenn Sie eine benutzerdefinierte Pizza bestellen. In diesem Fall sagt der Kellner zum Chefkoch (Builder): "Ich brauche eine Pizza; füge Käse, Zwiebeln und Speck hinzu!" Der Builder legt also die Attribute offen, die das erzeugte Objekt haben soll, aber er verbirgt, wie man sie einstellt.

Mit freundlicher Genehmigung

25voto

Rohit Singh Punkte 14318

Builder-Pattern und Factory-Pattern sind sich auf den ersten Blick ziemlich ähnlich, da sie beide Objekte für Sie erstellen.

Aber man muss genauer hinsehen

Anhand dieses Beispiels aus der Praxis wird der Unterschied zwischen beiden deutlich.

Angenommen, Sie gehen in ein Schnellrestaurant und bestellen Lebensmittel .

1) Welche Lebensmittel?

Pizza

2) Welche Beläge?

Paprika, Tomate, Grillhähnchen, NO PINEAPPLE

Die verschiedenen Arten von Lebensmitteln werden also nach dem Fabrikmuster hergestellt, aber die verschiedenen Varianten (Geschmacksrichtungen) eines bestimmten Lebensmittels werden nach dem Builder-Muster hergestellt.

Verschiedene Arten von Lebensmitteln

Pizza, Burger, Nudeln

Pizza-Varianten

Nur Käse, Käse+Tomate+Kapsel, Käse+Tomate usw.

Code-Beispiel

Ein Beispiel für die Implementierung der beiden Muster finden Sie hier
Bauherren-Muster
Fabrik-Muster

3 Stimmen

Vielen Dank für die Bereitstellung des Beispielcodes! Ihre Beispiele differenzieren diese 2 Muster sehr gut.

20voto

Isabel Jinson Punkte 8392

Beides sind Schöpfungsmuster, um Objekte zu schaffen.

1) Factory Pattern - Angenommen, Sie haben eine Oberklasse und N Unterklassen. Das Objekt wird erstellt, je nachdem, welcher Parameter/Wert übergeben wird.

2) Builder-Muster - zur Erstellung komplexer Objekte.

Ex: Make a Loan Object. Loan could be house loan, car loan ,
    education loan ..etc. Each loan will have different interest rate, amount ,  
    duration ...etc. Finally a complex object created through step by step process.

15voto

Janis Punkte 980

Zunächst einige allgemeine Dinge, um meiner Argumentation zu folgen:

Die größte Herausforderung bei der Entwicklung großer Softwaresysteme besteht darin, dass sie flexibel und einfach zu ändern sein müssen. Aus diesem Grund gibt es einige Metriken wie Kopplung und Kohäsion. Um Systeme zu erreichen, die in ihrer Funktionalität leicht verändert oder erweitert werden können, ohne dass das gesamte System von Grund auf neu entworfen werden muss, können Sie die Entwurfsprinzipien (wie SOLID usw.) befolgen. Nach einer Weile haben einige Entwickler erkannt, dass es ähnliche Lösungen für ähnliche Probleme gibt, wenn sie diese Prinzipien befolgen. Diese Standardlösungen entpuppten sich als die Entwurfsmuster.

Die Entwurfsmuster sollen Sie also dabei unterstützen, die allgemeinen Entwurfsprinzipien zu befolgen, um lose gekoppelte Systeme mit hoher Kohäsion zu erreichen.

Beantwortung der Frage:

Wenn Sie nach dem Unterschied zwischen zwei Mustern fragen, müssen Sie sich fragen, welches Muster Ihr System in welcher Weise flexibler macht. Jedes Muster hat seinen eigenen Zweck, um Abhängigkeiten zwischen Klassen in Ihrem System zu organisieren.

Das abstrakte Fabrik-Muster: GoF: "Bereitstellung einer Schnittstelle zur Erstellung von Familien verwandter oder abhängiger Objekte ohne Angabe ihrer konkreten Klassen."

Was bedeutet das? Durch die Bereitstellung einer solchen Schnittstelle wird der Aufruf des Konstruktors für jedes Produkt der Familie in der Fabrikklasse gekapselt. Und da dies die einzige Stelle in Ihrem gesamten System ist, an der diese Konstruktoren aufgerufen werden, können Sie Ihr System durch die Implementierung einer neuen Fabrikklasse ändern. Wenn Sie die Darstellung der Fabrik durch eine andere ersetzen, können Sie eine ganze Reihe von Produkten austauschen, ohne den Großteil Ihres Codes zu verändern.

Das Builder-Muster: GoF: "Trennen Sie die Konstruktion eines komplexen Objekts von seiner Darstellung, so dass ein und derselbe Konstruktionsprozess unterschiedliche Darstellungen erzeugen kann."

Was bedeutet das? Sie kapseln den Konstruktionsprozess in einer weiteren Klasse, dem sogenannten Regisseur (GoF). Dieser Direktor enthält den Algorithmus für die Erstellung neuer Instanzen des Produkts (z. B. die Zusammenstellung eines komplexen Produkts aus anderen Teilen). Um die Bestandteile des Gesamtprodukts zu erzeugen, verwendet der Direktor einen Builder. Durch den Austausch des Builders im Director können Sie denselben Algorithmus zur Erstellung des Produkts verwenden, aber die Darstellungen der einzelnen Teile (und damit die Darstellung des Produkts) ändern. Um Ihr System in der Darstellung des Produkts zu erweitern oder zu ändern, brauchen Sie nur eine neue Builder-Klasse zu implementieren.

Kurz und gut: Das Abstract Factory Pattern dient dazu, eine Reihe von Produkten auszutauschen, die für den gemeinsamen Gebrauch bestimmt sind. Der Zweck des Builder Patterns ist es, den abstrakten Algorithmus zur Erstellung eines Produkts zu kapseln, um ihn für verschiedene Darstellungen des Produkts wiederzuverwenden.

Meiner Meinung nach kann man nicht sagen, dass das Abstract Factory Pattern der große Bruder des Builder Patterns ist. JA, es sind beides Erstellungsmuster, aber die Hauptabsicht der Muster ist völlig unterschiedlich.

0 Stimmen

Nette Antwort, ausführliche Erklärung.

0 Stimmen

Können Sie bitte die Bedeutung von "Trennen Sie die Konstruktion eines komplexen Objekts von seiner Darstellung" erklären?

0 Stimmen

@Rajdeep die Erklärung ist zu lang für einen Kommentar, deshalb habe ich eine weitere Antwort geschrieben.

7voto

Hamady C. Punkte 1029

Fabrik : Wird verwendet, um eine Instanz eines Objekts zu erstellen, dessen Abhängigkeiten vollständig von der Fabrik gehalten werden. Für die abstraktes Fabrikmuster gibt es oft viele konkrete Implementierungen der gleichen abstrakten Fabrik. Die richtige Implementierung der Fabrik wird über Dependency Injection injiziert.

Bauherr : Zum Bauen verwendet unveränderlich Objekte, wenn die Abhängigkeiten des zu instanziierenden Objekts teilweise im Voraus bekannt sind und teilweise vom Auftraggeber des Builders bereitgestellt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X