it-swarm.com.de

Entwurfsmuster: Factory vs Factory-Methode vs Abstract Factory

Ich las Designmuster von einer Website

Dort las ich über Fabrik, Fabrikmethode und Abstrakte Fabrik, aber sie sind so verwirrend, dass die Definition nicht klar ist. Nach Definitionen

Factory - Erstellt Objekte, ohne die Instanziierungslogik für den Client verfügbar zu machen, und verweist über eine gemeinsame Schnittstelle auf das neu erstellte Objekt. Ist eine vereinfachte Version der Factory-Methode

Factory-Methode - Definiert eine Schnittstelle zum Erstellen von Objekten, lässt Unterklassen jedoch entscheiden, welche Klasse instanziiert werden soll, und verweist über eine gemeinsame Schnittstelle auf das neu erstellte Objekt.

Abstract Factory - Bietet die Schnittstelle zum Erstellen einer Familie verwandter Objekte, ohne deren Klassen explizit anzugeben.

Ich habe mir auch die anderen Stackoverflow-Threads zu Abstract Factory vs. Factory-Methode angesehen, aber die dort gezeichneten UML-Diagramme machen mein Verständnis noch schlimmer.

Kann mir bitte jemand sagen

  1. Wie unterscheiden sich diese drei Muster voneinander?
  2. Wann welche verwenden?
  3. Und wenn möglich auch Java Beispiele zu diesen Mustern?
156

Alle drei Factory-Typen machen dasselbe: Sie sind ein "smarter Konstruktor".

Angenommen, Sie möchten zwei Arten von Früchten erstellen können: Apple und Orange.

Fabrik

Factory ist "fest", da Sie nur eine Implementierung ohne Unterklassen haben. In diesem Fall haben Sie eine Klasse wie diese:

class FruitFactory {

  public Apple makeApple() {
    // Code for creating an Apple here.
  }

  public Orange makeOrange() {
    // Code for creating an orange here.
  }

}

Anwendungsfall: Die Konstruktion eines Apple oder eines Orange ist etwas zu komplex, um sie im Konstruktor verarbeiten zu können.

Fabrik Methode

Die Factory-Methode wird im Allgemeinen verwendet, wenn Sie eine allgemeine Verarbeitung in einer Klasse haben, aber variieren möchten, welche Art von Obst Sie tatsächlich verwenden. So:

abstract class FruitPicker {

  protected abstract Fruit makeFruit();

  public void pickFruit() {
    private final Fruit f = makeFruit(); // The fruit we will work on..
    <bla bla bla>
  }
}

... dann können Sie die allgemeine Funktionalität in FruitPicker.pickFruit() wiederverwenden, indem Sie eine Factory-Methode in Unterklassen implementieren:

class OrangePicker extends FruitPicker {

  @Override
  protected Fruit makeFruit() {
    return new Orange();
  }
}

Abstrakte Fabrik

Abstract Factory wird normalerweise für Dinge wie Abhängigkeitsinjektion/-strategie verwendet, wenn Sie in der Lage sein möchten, eine ganze Familie von Objekten zu erstellen, die von "derselben Art" sein müssen und einige gemeinsame Basisklassen haben sollen. Hier ist ein vages Beispiel für Obst. Der Anwendungsfall hier ist, dass wir sicherstellen möchten, dass wir einen OrangePicker nicht versehentlich auf einem Apple verwenden. Solange wir unsere Früchte und Pflücker aus der gleichen Fabrik bekommen, werden sie zusammenpassen.

interface PlantFactory {

  Plant makePlant();

  Picker makePicker(); 

}

public class AppleFactory implements PlantFactory {
  Plant makePlant() {
    return new Apple();
  }

  Picker makePicker() {
    return new ApplePicker();
  }
}

public class OrangeFactory implements PlantFactory {
  Plant makePlant() {
    return new Orange();
  }

  Picker makePicker() {
    return new OrangePicker();
  }
}
212
Anders Johansen
  1. Wie unterscheiden sich diese drei Muster voneinander?

Factory: Erstellt Objekte, ohne die Instanziierungslogik für den Client verfügbar zu machen.

Factory-Methode: Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, aber lassen Sie die Unterklassen entscheiden, welche Klasse instanziiert werden soll. Mit der Factory-Methode kann eine Klasse die Instanziierung auf Unterklassen verschieben

Abstract Factory: Bietet eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte, ohne deren konkrete Klassen anzugeben.

AbstractFactory Muster verwendet Komposition, um die Verantwortung für das Erstellen von Objekten an eine andere Klasse zu delegieren, während Factory-Methode Entwurfsmuster Vererbung verwendet und sich auf abgeleitete Klassen oder Unterklassen stützt, um Objekte zu erstellen

  1. Wann welche verwenden?

Factory: Der Client benötigt nur eine Klasse und kümmert sich nicht darum, welche konkrete Implementierung er erhält.

Factory-Methode: Der Client weiß nicht, welche konkreten Klassen zur Laufzeit erstellt werden müssen, sondern möchte nur eine Klasse erhalten, die den Job erledigt .

AbstactFactory: Wenn Ihr System mehrere Produktfamilien erstellen muss oder Sie eine Produktbibliothek bereitstellen möchten, ohne die Implementierungsdetails offenzulegen.

Abstract Factory-Klassen werden häufig mit der Factory-Methode implementiert. Factory-Methoden werden normalerweise in Template-Methoden aufgerufen.

  1. Und wenn möglich auch Java Beispiele zu diesen Mustern?

Factory und FactoryMethod

Intent:

Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, lassen Sie jedoch Unterklassen entscheiden, welche Klasse instanziiert werden soll. Mit der Factory-Methode kann eine Klasse die Instanziierung auf Unterklassen verschieben.

ML-Diagramm :

enter image description here

Product: Definiert eine Schnittstelle der Objekte, die die Factory-Methode erstellt.

ConcreteProduct: Implementiert die Produktschnittstelle

Creator: Deklariert die Factory-Methode

ConcreateCreator: Implementiert die Factory-Methode, um eine Instanz eines ConcreteProduct zurückzugeben

Problemstellung: Erstellen Sie eine Factory of Games mit Factory-Methoden, die die Spieloberfläche definieren.

Code-Auszug:

Factory Pattern. Wann sind Factory-Methoden anzuwenden?

Vergleich mit anderen Schöpfungsmustern:

  1. Das Design beginnt mit der Factory-Methode (weniger kompliziert, anpassbarer, Unterklassen vermehren sich) und entwickelt sich zu Abstract Factory, Prototype oder Builder (flexibler, komplexer), wenn der Designer feststellt, wo mehr Flexibilität erforderlich ist

  2. Abstract Factory-Klassen werden häufig mit Factory-Methoden implementiert, können dies aber auch implementiert werden mit Prototyp

Literaturhinweise zur weiteren Lektüre: Sourcemaking design-patterns

22
Ravindra babu

Factory - Separate Factory-Klasse zum Erstellen komplexer Objekte.

Beispiel: FruitFactory-Klasse zum Erstellen eines Fruit-Objekts

class FruitFactory{

public static Fruit getFruit(){...}

}

Factory-Methode - Anstelle der gesamten separaten Klasse für Factory fügen Sie einfach eine Methode in dieser Klasse selbst als Factory hinzu.

Ex:

Calendar.getInstance() (Java's Calendar)

Abstrakte Fabrikmethode - Fabrik der Fabrik

Bsp .: Nehmen wir an, wir wollen eine Fabrik für Computerteile bauen. Es gibt also verschiedene Arten von Computern wie Laptop, Desktop, Server.

Für jeden Computertyp brauchen wir also eine Fabrik. Also schaffen wir eine Fabrik mit Fabriken auf höchstem Niveau wie unten

ComputerTypeAbstractFactory.getComputerPartFactory(String computerType) ---> This will return PartFactory which can be one of these ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Nun sind diese 3 selbst wieder Fabriken. (Sie werden sich mit PartFactory selbst befassen, aber unter der Haube wird es eine separate Implementierung geben, die auf dem basiert, was Sie in abstract factory bereitgestellt haben.)

  Interface-> PartFactory. getComputerPart(String s), 
Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Usage:
new ComputerTypeAbstractFactory().getFactory(“Laptop”).getComputerPart(“RAM”)

BEARBEITEN: Überarbeitet, um genaue Schnittstellen für Abstract Factory gemäß den Einwänden in Kommentaren bereitzustellen.

17
Ravi K

Jedes Entwurfsmuster gedeiht, um sicherzustellen, dass der geschriebene, funktionierende Code nicht berührt wird. Wir alle wissen, dass es nach dem Berühren des Arbeitscodes Defekte in den vorhandenen Arbeitsabläufen gibt und dass noch viel mehr Tests durchgeführt werden müssen, um sicherzustellen, dass wir nichts kaputt gemacht haben.

Ein Factory-Muster erstellt Objekte auf der Grundlage von Eingabekriterien, wodurch sichergestellt wird, dass Sie keinen Code schreiben müssen, wie wenn dies dann dieses Objekt, sonst dieses Objekt, erstellt. Ein gutes Beispiel dafür ist eine Reise-Website. Eine Reise-Website kann nur Reisen (Flug, Zug, Bus) oder/und Hotels oder/und Pakete für Touristenattraktionen anbieten. Wenn ein Benutzer das nächste Mal auswählt, muss die Website entscheiden, welche Objekte erstellt werden sollen. Sollte es nur das Reise- oder Hotelobjekt auch schaffen.

Wenn Sie sich nun vorstellen, Ihrem Portfolio eine weitere Website hinzuzufügen, und der Meinung sind, dass derselbe Kern verwendet wird, z. B. eine Fahrgemeinschaftswebsite, die jetzt nach Taxis sucht und Online-Zahlungen vornimmt, können Sie eine abstrakte Factory als Kern verwenden. Auf diese Weise können Sie einfach eine weitere Fabrik von Kabinen und Fahrgemeinschaften einrasten lassen.

Beide Fabriken haben nichts miteinander zu tun, daher ist es ein gutes Design, sie in verschiedenen Fabriken zu halten.

Hoffe das ist jetzt klar. Studiere die Website noch einmal und denke dabei an dieses Beispiel. Hoffentlich hilft es. Und ich hoffe wirklich, dass ich die Muster richtig dargestellt habe :).

10
Siddharth

Für diese Antwort beziehe ich mich auf das Buch "Gang of Four".

Das Buch enthält no "Factory" -, "Simple Factory" - und "Virtual Factory" -Definitionen. Normalerweise Wenn die Leute über das Muster "Factory" sprechen, sprechen sie möglicherweise über etwas, das ein bestimmtes Objekt einer Klasse erzeugt (aber nicht über das Muster "Builder"); sie können oder dürfen nicht beziehen sich auf die Muster "Factory Method" oder "Abstract Factory". Jeder kann "Factory" implementieren, wie er es nicht tun wird, da es sich nicht um einen offiziellen Begriff handelt (bedenken Sie, dass einige Leute\Unternehmen\Communities ihr eigenes Vokabular haben können).

Das Buch only enthält Definitionen für "Abstract Factory" und "Factory Method".

Hier sind Definitionen aus dem Buch und eine kurze Erklärung, warum beide so verwirrend sein können. Ich lasse Codebeispiele weg, weil Sie sie in anderen Antworten finden können:

Factory-Methode (GOF): Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, aber lassen Sie Unterklassen entscheiden, welche Klasse instanziiert werden soll. Mit der Factory-Methode kann eine Klasse die Instanziierung auf Unterklassen verschieben.

Abstract Factory (GOF): Bereitstellung einer Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte, ohne deren konkrete Klassen anzugeben.

Quelle der Verwirrung: Oft kann man eine Klasse, die im Muster "Factory Method" verwendet wird, als "Factory" bezeichnen. Diese Klasse ist per Definition abstrakt. Deshalb ist es einfach, diese Klasse "Abstrakte Fabrik" zu nennen. Aber es ist nur der Name der Klasse; Sie sollten es nicht mit dem Muster "Abstract Factory" (Klassenname! = Mustername) verwechseln. Das "Abstract Factory" -Muster ist anders - es nicht verwendet eine abstrakte Klasse; Es definiert eine Schnittstelle (nicht unbedingt eine Programmiersprachenschnittstelle) zum Erstellen von Teilen eines größeren Objekts oder von Objekten, die miteinander in Beziehung stehen oder auf eine bestimmte Weise erstellt werden müssen.

1
Pavel Sapehin
AbstractProductA, A1 and A2 both implementing the AbstractProductA
AbstractProductB, B1 and B2 both implementing the AbstractProductB

interface Factory {
    AbstractProductA getProductA(); //Factory Method - generate A1/A2
}

Mit der Factory-Methode kann der Benutzer A1 oder A2 von AbstractProductA erstellen.

interface AbstractFactory {
    AbstractProductA getProductA(); //Factory Method
    AbstractProductB getProductB(); //Factory Method
}

Aber Abstract Factory hat mehr als 1 Factory-Methode (zB 2 Factory-Methoden). Mit diesen Factory-Methoden wird der Satz von Objekten/verwandten Objekten erstellt. Mit Abstract Factory kann der Benutzer A1-, B1-Objekte von AbstractProductA, AbstractProductB erstellen

1
rameshvanka