620 Stimmen

Was sind die Unterschiede zwischen den Entwurfsmustern Abstract Factory und Factory?

Ich weiß, dass es viele Beiträge über die Unterschiede zwischen diesen beiden Mustern gibt, aber es gibt ein paar Dinge, die ich nicht finden kann.

Aus dem, was ich gelesen habe, sehe ich, dass die Fabrik-Methode Muster ermöglicht es Ihnen zu definieren, wie ein einzelnes konkretes Produkt zu schaffen, sondern versteckt die Umsetzung aus dem Client, wie sie ein generisches Produkt sehen wird. Meine erste Frage bezieht sich auf die abstrakte Fabrik. Erlaubt sie die Erstellung von Familien konkreter Objekte (die von der verwendeten Fabrik abhängen können) und nicht nur eines einzelnen konkreten Objekts? Gibt die abstrakte Fabrik nur ein sehr großes Objekt zurück oder viele Objekte, je nachdem, welche Methoden Sie aufrufen?

Meine letzten beiden Fragen beziehen sich auf ein einziges Zitat, das ich nicht ganz verstehe und das ich an zahlreichen Stellen gesehen habe:

Ein Unterschied zwischen den beiden ist, dass mit dem abstrakten Fabrikmuster, eine Klasse die Verantwortung für die Objektinstanziierung an ein anderes Objekt durch Komposition delegiert, während das Factory Methoden-Muster Vererbung verwendet und eine Unterklasse für die gewünschte gewünschten Objektinstanziierung.

Ich verstehe, dass das Factory-Methodenmuster eine Creator-Schnittstelle hat, die den ConcreteCreator wissen lässt, welches ConcreteProduct er instanziieren soll. Ist es das, was mit der Verwendung von Vererbung zur Handhabung der Objektinstanziierung gemeint ist?

Wie genau delegiert das Muster der abstrakten Fabrik die Verantwortung für die Instanziierung eines Objekts über die Komposition an ein anderes Objekt, um sich auf dieses Zitat zu beziehen? Was ist damit gemeint? In meinen Augen sieht es so aus, als ob das Abstract Factory-Muster auch die Vererbung nutzt, um den Konstruktionsprozess durchzuführen, aber auch hier bin ich noch dabei, etwas über diese Muster zu lernen.

Für jede Hilfe, insbesondere bei der letzten Frage, wäre ich sehr dankbar.

14voto

Abdul Munim Punkte 18167

Zum besseren Verständnis ein Beispiel.

Was bieten die Telekommunikationsunternehmen an? Breitband, Telefon und Mobilfunk zum Beispiel, und du sollst eine Anwendung erstellen, um ihren Kunden ihre Produkte anzubieten.

In der Regel werden die Produkte, d. h. Breitband, Telefonanschluss und Mobiltelefon, über Ihren Fabrik-Methode wo Sie wissen, welche Eigenschaften Sie für diese Produkte haben, und es ist ziemlich einfach.

Jetzt will das Unternehmen seinen Kunden ein Bündel seiner Produkte anbieten, d. h. Breitband, Telefonanschluss und Mobiltelefon, und hier kommt die Abstrakte Fabrik zu spielen.

Abstrakte Fabrik ist, mit anderen Worten, die Zusammensetzung der anderen Fabriken, die für die Herstellung ihrer eigenen Produkte verantwortlich sind und Abstrakte Fabrik weiß, wie sie diese Produkte im Hinblick auf ihre eigene Verantwortung sinnvoller einsetzen kann.

In diesem Fall ist die BundleFactory ist die Abstrakte Fabrik, BroadbandFactory , PhonelineFactory y MobileFactory sind die Factory . Zur weiteren Vereinfachung werden diese Fabriken über Fabrik-Methode um die einzelnen Produkte zu initialisieren.

Siehe das Codebeispiel unten:

public class BroadbandFactory : IFactory {
    public static Broadband CreateStandardInstance() {
        // broadband product creation logic goes here
    }
}

public class PhonelineFactory : IFactory {
    public static Phoneline CreateStandardInstance() {
        // phoneline product creation logic goes here
    }
}

public class MobileFactory : IFactory {
    public static Mobile CreateStandardInstance() {
        // mobile product creation logic goes here
    }
}

public class BundleFactory : IAbstractFactory {

    public static Bundle CreateBundle() {
        broadband = BroadbandFactory.CreateStandardInstance();
        phoneline = PhonelineFactory.CreateStandardInstance();
        mobile = MobileFactory.CreateStandardInstance();

        applySomeDiscountOrWhatever(broadband, phoneline, mobile);
    }

    private static void applySomeDiscountOrWhatever(Broadband bb, Phoneline pl, Mobile m) {
        // some logic here
        // maybe manange some variables and invoke some other methods/services/etc.
    }
}

Ich hoffe, das hilft.

10voto

user2266614 Punkte 99

Fabrik-Methode beruht auf Vererbung: Die Objekterstellung wird an Unterklassen delegiert, die die Factory-Methode zur Objekterstellung implementieren.

Abstrakte Fabrik beruht auf der Komposition von Objekten: Die Erstellung von Objekten wird in Methoden implementiert, die in der Fabrikschnittstelle enthalten sind.

High-Level-Diagramm von Factory und Abstract factory pattern,

diagram

Weitere Informationen über die Methode Factory finden Sie unter dieser Artikel .

Weitere Informationen über die Methode Abstract factory finden Sie unter dieser Artikel .

8voto

Beispiel aus dem wirklichen Leben. (Leicht zu merken)

Fabrik

Stellen Sie sich vor, Sie bauen ein Haus und fragen einen Schreiner nach einer Tür. Sie geben die Maße für die Tür und Ihre Anforderungen an, und er wird eine Tür für Sie bauen. In diesem Fall ist der Schreiner eine Fabrik für Türen. Ihre Angaben sind der Input für die Fabrik, und die Tür ist der Output oder das Produkt der Fabrik.

Abstrakte Fabrik

Betrachten wir nun das gleiche Beispiel der Tür. Sie können zu einem Schreiner gehen, oder Sie können zu einem Geschäft für Kunststofftüren oder zu einem PVC-Geschäft gehen. Sie alle sind Türenfabriken. Je nach Situation entscheiden Sie, welche Art von Fabrik Sie aufsuchen müssen. Dies ist wie eine abstrakte Fabrik.

Ich habe hier sowohl das Factory-Methoden-Muster als auch das abstrakte Factory-Muster erklärt, beginnend damit, dass ich sie nicht verwende, um Probleme zu erklären, und dann Probleme zu lösen, indem ich die oben genannten Muster verwende https://github.com/vikramnagineni/Design-Patterns/tree/master

4voto

Ravindra babu Punkte 45577
  1. Meine erste Frage bezieht sich auf die abstrakte Fabrik. Ist seine Rolle, damit Sie Familien von konkreten Objekten in (das kann davon abhängen, welche spezifische Fabrik Sie verwenden) anstatt nur ein einzelnes konkretes Objekt erstellen?

Ja, das ist die Absicht von Abstract Factory:

Bereitstellung einer Schnittstelle zur Erstellung von Familien verwandter oder abhängiger Objekte ohne Angabe ihrer konkreten Klassen.


  1. Gibt die abstrakte Fabrik nur ein sehr großes Objekt zurück oder viele Objekte, je nachdem, welche Methoden Sie aufrufen?

Im Idealfall sollte sie ein Objekt für jede Methode zurückgeben, die der Client aufruft.

  1. Meines Erachtens hat das Factory-Methoden-Muster eine Creator-Schnittstelle, über die der ConcreteCreator weiß, welches ConcreteProduct er instanziieren soll. Ist es das, was mit der Verwendung von Vererbung zur Handhabung der Objektinstanziierung gemeint ist?

Ja. Die Factory-Methode verwendet Vererbung.

  1. Abstrakte Factory-Muster delegieren die Verantwortung für die Instanziierung eines Objekts an ein anderes Objekt durch Komposition? Was bedeutet dies?

AbstractFactory definiert eine FactoryMethod und ConcreteFactory ist für die Erstellung eines ConcreteProduct verantwortlich. Folgen Sie einfach dem Codebeispiel in diesem Artikel .

Weitere Einzelheiten finden Sie in den entsprechenden SE-Beiträgen:

Was ist der grundlegende Unterschied zwischen Factory und Abstract Factory Patterns?

Entwurfsmuster: Fabrik vs. Fabrikmethode vs. Abstrakte Fabrik

4voto

Anand Punkte 181

Es gibt eine ganze Reihe von Definitionen. Grundsätzlich sind die drei gängigsten Beschreibungsweisen Fabrikmuster sont

  1. Einfache Fabrik

Einfache Methode/Klasse zur Erstellung von Objekten auf der Grundlage einer Bedingung.

  1. Fabrik-Methode

Das Entwurfsmuster der Factory-Methode, bei dem Unterklassen für die Implementierung verwendet werden.

  1. Abstrakte Fabrik

Das Entwurfsmuster Abstract Factory erzeugt Familien von verwandten oder abhängigen Objekten, ohne deren konkrete Klassen zu spezifizieren.

Der untenstehende Link war sehr nützlich - Fabrikvergleich - refactoring.guru

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