Was ist der grundlegende Unterschied zwischen den Factory- und den Abstract Factory Design Patterns?[geschlossen]

StackOverflow https://stackoverflow.com/questions/1001767

Frage

Was ist der grundlegende Unterschied zwischen dem Factory- und dem Abstract Factory-Muster?

War es hilfreich?

Lösung

Mit dem Fabrikmuster erzeugen Sie Instanzen von Implementierungen (Apple, Banana, Cherry, usw.) einer bestimmten Schnittstelle - sagen wir, IFruit.

Mit dem abstrakten Fabrikmuster bieten Sie jedem eine Möglichkeit, eine eigene Fabrik bereitzustellen. Dies ermöglicht es Ihrem Lagerhaus, entweder eine zu sein IFruitFactory oder an IJuiceFactory, ohne Ihr Lagerhaus etwas über Obst oder Säfte zu wissen.

Andere Tipps

Quelle für diese Informationen aus: http://java.dzone.com/news/intro-design-pattern-abstract

Abstrakte Fabrik vs. Fabrikmethode

Die Methoden einer abstrakten Fabrik werden als Werksmethoden implementiert. Sowohl das abstrakte Fabrikmuster als auch das Factory -Methodenmuster entkoppeln das Client -System aus den tatsächlichen Implementierungsklassen über die abstrakten Typen und Fabriken. Die Fabrikmethode erzeugt Objekte durch Vererbung, bei denen die abstrakte Fabrik Objekte durch Zusammensetzung erzeugt.

Das abstrakte Fabrikmuster besteht aus einem abstrakten, konkretenfaktorischen, abstraktenProdukt, Betonprodukt und Kunden.

Wie man implementiert

Das abstrakte Fabrikmuster kann mit dem Werksmethodenmuster, dem Prototypmuster oder dem Singleton -Muster implementiert werden. Das konkretefaktorische Objekt kann als Singleton implementiert werden, da nur eine Instanz des konkretenfaktorischen Objekts erforderlich ist.

Factory Method Muster ist eine vereinfachte Version des abstrakten Fabrikmusters. Das Factory -Methodenmuster ist verantwortlich für die Erstellung von Produkten, die einer Familie gehören, während das abstrakte Werksmuster mit mehreren Produkten von Produkten befasst.

Die Werksmethode verwendet Schnittstellen und abstrakte Klassen, um den Kunden aus der Generatorklasse und den resultierenden Produkten zu entkoppeln. Abstract Factory verfügt über einen Generator, der ein Container für verschiedene Werksmethoden ist, zusammen mit Schnittstellen, die den Kunden vom Generator und den Produkten entkoppeln.

Wann verwenden Sie das Factory -Methode -Muster

Verwenden Sie das Factory -Methodenmuster, wenn ein Client von einem bestimmten Produkt entkoppelt werden muss. Verwenden Sie die Werksmethode, um einen Client für die Verantwortung für das Erstellen und Konfigurieren eines Produkts zu lindern.

Wann ist das abstrakte Fabrikmuster zu verwenden

Verwenden Sie das abstrakte Fabrikmuster, wenn Kunden von Produktklassen entkoppelt werden müssen. Besonders nützlich für die Programmkonfiguration und -änderung. Das abstrakte Fabrikmuster kann auch Einschränkungen darüber erzwingen, welche Klassen mit anderen verwendet werden müssen. Es kann eine Menge Arbeit sein, neue konkrete Fabriken zu machen.

Beispiele:

Zusammenfassung Fabrikbeispiel 1

Diese Spezifikation für die Festplatten zur Vorbereitung verschiedener Pasta -Pasta in einem Pasta -Hersteller ist die abstrakte Fabrik, und jede bestimmte Festplatte ist eine Fabrik. Alle Fabriken (Pasta Maker Disks) erben ihre Eigenschaften aus der abstrakten Fabrik. Jede einzelne Festplatte enthält die Informationen über die Erstellung der Pasta, und der Pasta -Hersteller nicht.

Zusammenfassung Fabrikbeispiel 2:

Die Stempelgeräte entspricht der abstrakten Fabrik, da es sich um eine Schnittstelle für Operationen handelt, die abstrakte Produktobjekte erzeugen. Die Stanze entsprechen der konkreten Fabrik, da sie ein konkretes Produkt erstellen. Jede Teilkategorie (Kapuze, Tür usw.) entspricht dem abstrakten Produkt. Spezifische Teile (dh Treibertür für 99 Camry) entsprechen den Betonprodukten.

Beispiel für Werksmethoden:

Das Spielzeugunternehmen entspricht dem Schöpfer, da die Fabrik möglicherweise Produktobjekte erstellt. Die Aufteilung des Spielzeugunternehmens, die eine bestimmte Art von Spielzeug (Pferd oder Auto) herstellt, entspricht dem ConcreTecreator.

Fabrikmuster: Die Fabrik erzeugt iProduct-Implementationen

Zusammenfassung Fabrikmuster: Ein Werksfaktor erzeugt Ifaktorien, was wiederum iProducts erzeugt :)

Update gemäß den Kommentaren
Was ich früher geschrieben habe, ist nach nicht korrekt Wikipedia wenigstens. Eine abstrakte Fabrik ist einfach eine Fabrikschnittstelle. Damit können Sie Ihre Fabriken zur Laufzeit wechseln, um unterschiedliche Fabriken in verschiedenen Kontexten zu ermöglichen. Beispiele könnten unterschiedliche Fabriken für verschiedene Betriebssysteme, SQL-Anbieter, Middleware-Fahrer usw. sein.

Das abstrakte Fabrikmuster

  • Stellen Sie eine Schnittstelle zum Erstellen von Familien verwandter oder abhängiger Objekte bereit, ohne deren konkrete Klassen anzugeben.

  • Das abstrakte Fabrikmuster ist dem Fabrikmethodenmuster sehr ähnlich. Ein Unterschied zwischen den beiden besteht darin, dass eine Klasse mit dem abstrakten Fabrikmuster die Verantwortung der Objektinstanziierung über eine andere Objekt über Zusammensetzung delegiert, während das Werksmethodenmuster die Vererbung verwendet und sich auf eine Unterklasse stützt, um die gewünschte Objekt -Instanziation zu verarbeiten.

  • Tatsächlich verwendet das delegierte Objekt häufig Werksmethoden, um die Instanziierung durchzuführen!

Fabrikmuster

  • Fabrikmuster sind Beispiele für Kreationmuster

  • Kreationmuster Zusammenfassung des Objekt -Instanziierungsprozesses. Sie verbergen, wie Objekte erstellt werden, und machen das Gesamtsystem unabhängig von der Erstellung und Komponente seiner Objekte.

  • Klassenerstellungsmuster konzentrieren

  • Objektkreationale Muster konzentrieren sich auf die Delegation der Instanziierung an ein anderes Objekt abstrakter Fabrik

Bezug:Fabrik gegen abstrakte Fabrik

Fabrikmethode: Sie haben eine Fabrik, die Objekte erstellt, die aus einer bestimmten Basisklasse stammen

Zusammenfassung Fabrik: Sie haben eine Fabrik, die schafft Andere Fabriken, und diese Fabriken erstellen wiederum Objekte, die aus Basisklassen abgeleitet sind. Sie tun dies, weil Sie oft nicht nur ein einzelnes Objekt erstellen möchten (wie bei der Werksmethode), sondern eine Sammlung verwandter Objekte erstellen möchten.

Abstract Factory ist eine Schnittstelle zum Erstellen verwandter Objekte, aber die Werksmethode ist eine Methode. Abstract Factory wird nach Fabrikmethode implementiert.

enter image description here

Grundunterschied:

Fabrik: Erstellt Objekte, ohne die Instanziierungslogik dem Client auszusetzen.

Fabrikmethode: Definieren Sie eine Schnittstelle zum Erstellen eines Objekts, lassen Sie die Unterklassen jedoch entscheiden, welche Klasse so instanziiert werden soll. Mit der Fabrikmethode können eine Klasse die Instanziierung in Unterklassen verschieben

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

AbstractFactory Muster verwendet die Komposition, um die Verantwortung für das Erstellen von Objekten für eine andere Klasse zu delegieren, während Fabrikmethode Muster verwendet Vererbung und stützt sich auf abgeleitete Klasse oder Unterrichtsklasse, um Objekt zu erstellen

Aus oodesign Artikel:

Fabrik Klassen Diagramm:

enter image description here

Beispiel: staticFactory

 public class ShapeFactory {

   //use getShape method to get object of type shape 
   public static Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}

In diesem Beitrag ist das Beispiel für nicht-statische Fabrik-Implementierungen verfügbar:

Entwurfsmuster: Fabrik gegen Fabrikverfahren gegen abstrakte Fabrik

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

Fabrikmethode Klasse Digaram:

enter image description here

Wann zu verwenden: Der Kunde weiß nicht, welche konkreten Klassen er zur Laufzeit erstellen muss, sondern möchte nur eine Klasse erhalten, die den Job erledigt.

Zusammenfassung Fabrik Klassendiagramm von Dzone

enter image description here

Wann zu verwenden: Wenn Ihr System mehrere Produkte von Produkten erstellen muss oder Sie eine Produktbibliothek bereitstellen möchten, ohne die Implementierungsdetails aufzudecken.

Beispiele für Quellcode in den oben genannten Artikeln sind sehr gut, um die Konzepte klar zu verstehen.

Verwandte SE -Frage mit Codebeispiel:

Fabrikmuster. Wann verwenden Sie Fabrikmethoden?

Unterschiede:

  1. Abstrakte Fabrikklassen werden häufig mit Werksmethoden implementiert, können jedoch auch mit Prototypen implementiert werden
  2. Die Entwürfe beginnen mithilfe der Werksmethode (weniger kompliziert, anpassbarer, Unterklassen vermehren sich) und entwickeln sich zu anderen Erstellungsmustern (flexibler, komplexere), bei denen mehr Flexibilität erforderlich ist.
  3. Fabrikmethoden werden normalerweise innerhalb von Vorlagenmethoden aufgerufen.

Andere nützliche Artikel:

factory_method von der Quellherstellung

Abstract_factory von der Quellherstellung

Zusammenfassung faktorisch-Design-Muster von Journaldev

Beispiel/Szenario für abstrakte Fabrik

Ich lebe an einem Ort, an dem es in der Regenzeit regnet, im Winter schneit und im Sommer heiß und sonnig. Ich brauche andere Kleidung, um mich vor den Elementen zu schützen. Dazu gehe ich in das Geschäft in der Nähe meines Hauses und bitte um Kleidung/Gegenstände, um mich zu schützen. Der Ladenbesitzer gibt mir den entsprechenden Gegenstand gemäß der Umgebung und der Tiefe meiner Tasche. Die Artikel, die er mir gibt, haben die gleiche Qualität und Preisspanne. Da er sich meiner Standards bewusst ist, ist es für ihn leicht, dies zu tun. Aber wenn ein reicher Mann aus der anderen Straßenseite die gleichen Anforderungen erfasst, erhält er einen teuren Markenartikel. Eine spürbare Sache sind alle Gegenstände, die er mir gibt, die sich in der Laufzeit von Qualität, Standard und Kosten ergänzen. Man kann sagen, dass sie miteinander gehen. Gleiches gilt für die Gegenstände, die dieser reiche Mann bekommt.

Wenn ich mir das obige Szenario anschaue, schätze ich jetzt die Effizienz des Ladenbesitzers. Ich kann diesen Ladenbesitzer durch einen abstrakten Laden ersetzen. Die Artikel, die wir mit abstrakten Gegenständen und mir und den Reichen als Perspektivkunden erhalten. Alles, was wir brauchen, ist das Produkt/Artikel, das unseren Bedürfnissen entspricht.

Jetzt kann ich mir leicht sehen, dass ich einen Online -Shop in Betracht ziehe, das seinen zahlreichen Kunden eine Reihe von Diensten bietet. Jeder Kunde gehört zu einer der drei Gruppen. Wenn ein Premium -Gruppenbenutzer die Website öffnet, erhält er eine großartige Benutzeroberfläche, einen hochgewohnten Werbebereich, mehr Optionen in den Menüs usw. Die gleichen Funktionen werden dem Goldbenutzer präsentiert. und etwas weniger egronomische Benutzeroberfläche. Zuletzt ist meine Art von Benutzer, ein Benutzer der „freien Gruppe“. Ich werde gerade genug serviert, damit ich nicht beleidigt bin. Die Benutzeroberfläche ist ein Minimum, Anzeigen sind so viel vom Track, dass ich nicht weiß, was drin kommt. Schließlich hat das Menü nur ein Anmelden.

Wenn ich die Möglichkeit habe, so etwas wie diese Website zu erstellen, würde ich definitiv das abstrakte Werksmuster in Betracht ziehen.

Abstract Products: Werbebereich, Menü, UI -Maler.
Abstrakte Fabrik: Benutzererfahrung im Web Store
Concreate Factory: Premium -Benutzererfahrung, Goldbenutzererfahrung, allgemeine Benutzererfahrung.

Viele Menschen werden vielleicht überrascht sein, aber diese Frage ist es falsch.Wenn Sie diese Frage während eines Interviews hören, müssen Sie dem Interviewer helfen, zu verstehen, wo die Verwirrung liegt.

Beginnen wir mit der Tatsache, dass es kein konkretes Muster gibt, das einfach „Fabrik“ heißt.Es gibt ein Muster namens „Abstract Factory“ und ein Muster namens „Factory Method“.

Was bedeutet also „Fabrik“?eine der folgenden Aussagen (je nach Umfang der Referenz können alle als richtig angesehen werden):

  • Manche Leute verwenden es als Alias ​​(Abkürzung) für „Abstrakte Fabrik".
  • Manche Leute verwenden es als Alias ​​(Abkürzung) für „Fabrikmethode".
  • Manche Leute verwenden es als allgemeinere Bezeichnung für alle Fabrik-/Kreationsmuster.Z.B.Sowohl „Abstract Factory“ als auch „Factory Method“ sind Fabriken.

Und, Leider, Viele Leute verwenden „Factory“, um eine andere Art von Fabrik zu bezeichnen, die eine oder mehrere Fabriken (oder deren Schnittstellen) erstellt.Basierend auf ihrer Theorie:

Produkt implementiert IProduct, das von Factory erstellt wird, die implementiert IFactory, das von AbstractFactory erstellt wird.

Um zu verstehen, wie albern das ist, setzen wir unsere Gleichung fort:

AbstractFactory implementiert IAbstractFactory, das von ... erstellt wird.AbstractAbstractFactory???

Ich hoffe, Sie verstehen den Punkt.Lassen Sie sich nicht verwirren und erfinden Sie bitte keine Dinge, die es nicht aus gutem Grund gibt.

-

P.S.:Factory for Products ist AbstractFactory, und Factory for Abstract Factories wäre ebenfalls nur ein weiteres Beispiel für AbstractFactory.

//Abstract factory - Provides interface to create factory of related products
interface PizzaIngredientsFactory{    
   public Dough createDough(); //Will return you family of Dough
   public Clam createClam();   //Will return you family of Clam
   public Sauce createSauce(); //Will return you family of Sauce
}

class NYPizzaIngredientsFactory implements PizzaIngredientsFactory{

   @Override
   public Dough createDough(){
      //create the concrete dough instance that NY uses
      return doughInstance;
   }

   //override other methods
} 

Die Lehrbuchdefinitionen werden bereits durch andere Antworten bereitgestellt. Ich dachte, ich würde auch ein Beispiel dafür geben.

Also hier die PizzaIngredientsFactory ist ein Zusammenfassung Fabrik da es Methoden zur Schaffung einer Familie verwandter Produkte bietet.

Beachten Sie, dass jede Methode in der abstrakten Fabrik eine ist Fabrikmethode an sich. Wie createDough() ist an sich eine Fabrikmethode, deren konkrete Implementierungen von Unterklassen wie möglich bereitgestellt werden NYPizzaIngredientsFactory. Wenn Sie dies verwenden, kann jeder unterschiedliche Standort Instanzen von Betonzutaten erzeugen, die zu ihrem Standort gehören.

Fabrikmethode

Bietet eine Instanz der konkreten Implementierung

Im Beispiel:
- createDough() - Bietet eine konkrete Implementierung für Teig. Das ist also eine Fabrikmethode

Zusammenfassung Fabrik

Bietet eine Schnittstelle zum Erstellen einer Familie verwandter Objekte

Im Beispiel:
- PizzaIngredientsFactory ist eine abstrakte Fabrik, die es ermöglicht, einen verwandten Satz von Objekten zu erstellen wie Dough, Clams, Sauce. Für die Erstellung jeder Objektfamilie bietet sie eine Fabrikmethode.

Beispiel von Kopf erster Designmuster

Ich habe einige Punkte, um Johns Antwort wie folgt beizutragen:

Abstract Factory ist eine Fabrik der Fabriken!

Mit der "Factory -Methode" (weil nur "Fabrik" mehrdeutig ist) erstellen Sie Implementierungen (Lemon, Orange, usw.) einer bestimmten Schnittstelle - sagen wir, IFruit. Diese Fabrik könnte genannt werden CitricFruitFactory.

Aber jetzt möchten Sie eine andere Arten von Obst erstellen, die der Citricfruitfactory nicht erstellen kann. Vielleicht der Code von CitricFruitFactory würde keinen Sinn machen, wenn Sie eine erstellen Strawberry darin (Erdbeere ist keine Zitronenfrucht!).

Sie könnten also eine neue Fabrik genannt werden RedFruitFactory das produziert Strawberry, Raspberry, etc.

Wie John Feminella sagte: "Mit dem abstrakten Fabrikmuster erstellen Sie Implementierungen einer bestimmten Fabrikschnittstelle - z. IFruitFactory. Jeder von denen weiß, wie man verschiedene Arten von Früchten kreiert. "

Das implementatios von IFruitFactory sind CitricFruitFactory und RedFruitFactory!

Meine Quellen sind: StackOverflow, tutorialspoint.com, programmers.stackexchange.com und CodeProject.com.


Factory Method (auch genannt Factory) ist für Decouple Client von a Interface Implementierung. Für die Probe haben wir a Shape Schnittstelle mit zwei Circle und Square Implementierungen. Wir haben eine Fabrikklasse mit einer Fabrikmethode mit einem Determinerparameter wie definiert, z. B. Type und neue verwandte Umsetzung von Shape Schnittstelle.


Abstract Factory Enthält mehrere Fabrikmethoden oder eine Fabrikschnittstelle durch mehrere Werkseinführungen. Für das nächste Beispiel haben wir a Color Schnittstelle mit zwei Red und Yellow Implementierungen. Wir haben a definiert ShapeColorFactory Schnittstelle mit zwei RedCircleFactory und YellowSquareFactory. Folgende Code für das Erläutern Sie dieses Konzept:

interface ShapeColorFactory
{
    public Shape getShape();
    public Color getColor();
}

class RedCircleFactory implements ShapeColorFactory
{
    @Override
    public Shape getShape() {
        return new Circle();
    }

    @Override
    public Color getColor() {
        return new Red();
    }
}
class YellowSquareFactory implements ShapeColorFactory
{
    @Override
    public Shape getShape() {
        return new Square();
    }

    @Override
    public Color getColor() {
        return new Yellow();
    }
} 

Hier Unterschied zwischen FactoryMethod und AbstractFactory. Factory Method als einfach eine konkrete Klasse einer Schnittstelle zurückgeben, aber Abstract Factory Rückkehr factory of factory. Mit anderen Worten Abstract Factory Rückgabe verschiedener Kombination einer Reihe von Schnittstellen.


Ich hoffe meine Erklärung nützlich.

Der Hauptunterschied in diesen Fabriken besteht darin, dass das, was Sie mit den Fabriken tun möchten, und wann Sie sie verwenden möchten.

Wenn Sie IOC (Inversion der Kontroll -EG -Konstruktorinjektion) durchführen, wissen Sie manchmal, dass Sie feste Objekte erstellen können. Wie im obigen Beispiel der Früchte erwähnt, können Sie einfach einfach werden, wenn Sie bereit sind, Objekte von Früchten zu erstellen Fabrikmuster.

Aber oft möchten Sie keine soliden Objekte erstellen, sie werden später im Programmfluss kommen. Die Konfiguration zeigt jedoch, welche Art von Fabrik Sie zu Beginn verwenden möchten, anstatt Objekte zu erstellen, Sie können Fabriken weitergeben, die von einer gemeinsamen Fabrikklasse an den Konstruktor in IOC abgeleitet werden.

Ich denke also, es geht auch um die Lebensdauer und Schöpfung des Objekts.

Beide Factory Method und Abstract Factory Halten Sie die Clients von den Betontypen entkoppelt. Beide erstellen Objekte, aber Factory Methode verwendet die Vererbung, während Abstract Factory Verwenden Sie Komposition.

Das Factory Method wird in Unterklassen geerbt, um die Betonobjekte (Produkte) zu erstellen, während Abstract Factory Stellen Sie eine Schnittstelle zur Erstellung der Familie verwandter Produkte und der Unterklasse dieser Schnittstelle zur Verfügung, um verwandte Produkte zu erstellen.

Dann werden diese Unterklassen beim Instanziieren in Produktklassen übergeben, in denen sie als abstrakter Typ verwendet werden. Die zugehörigen Produkte in einem Abstract Factory werden oft mit Verwendung implementiert Factory Method.

Erweiterung von John Feminella Antwort:

Apple, Banana, Cherry Geräte FruitFactory Und das hat eine Methode genannt Create das ist ausschließlich für die Schaffung von Apfel oder Bananen oder Kirsche verantwortlich. Du bist fertig mit deinem Factory Methode.

Jetzt willst du Create Ein besonderer Salat aus Ihren Früchten und da kommt Ihr Zusammenfassung Fabrik. Abstract Factory weiß, wie Sie Ihren speziellen Salat aus Apfel, Banane und Kirsche erstellen.

public class Apple implements Fruit, FruitFactory {
    public Fruit Create() {
        // Apple creation logic goes here
    }
}

public class Banana implements Fruit, FruitFactory {
    public Fruit Create() {
        // Banana creation logic goes here
    }
}

public class Cherry implements Fruit, FruitFactory {
    public Fruit Create() {
        // Cherry creation logic goes here
    }
}

public class SpecialSalad implements Salad, SaladFactory {
    public static Salad Create(FruitFactory[] fruits) {
        // loop through the factory and create the fruits.
        // then you're ready to cut and slice your fruits 
        // to create your special salad.
    }
}

Per Definition können wir die Unterschiede von zwei herausziehen:

Fabrik: Eine Schnittstelle wird zum Erstellen eines Objekts verwendet, aber die Unterklasse entscheidet, welche Klasse zu instanziieren soll. Die Erstellung von Objekten erfolgt, wenn dies erforderlich ist.

Abstrakte Fabrik: Das abstrakte Fabrikmuster fungiert als Super-Faktor, das andere Fabriken schafft. In abstraktem Werksmuster ist eine Schnittstelle für das Erstellen einer Reihe verwandter Objekte oder abhängiger Objekte verantwortlich, ohne ihre konkreten Klassen anzugeben.

In den obigen Definitionen können wir also einen bestimmten Unterschied hervorheben. Das Fabrikmuster ist für das Erstellen von Objekten verantwortlich und die abstrakte Fabrik ist für das Erstellen einer Reihe verwandter Objekte verantwortlich. Offensichtlich beide durch eine Schnittstelle.

Fabrikmuster:

public interface IFactory{
  void VehicleType(string n);
 }

 public class Scooter : IFactory{
  public void VehicleType(string n){
   Console.WriteLine("Vehicle type: " + n);
  }
 }

 public class Bike : IFactory{
  public void VehicleType(string n) {
  Console.WriteLine("Vehicle type: " + n);
  }
 }

 public interface IVehicleFactory{
  IFactory GetVehicleType(string Vehicle);
 }

 public class ConcreteVehicleFactory : IVehicleFactory{
 public IFactory GetVehicleType(string Vehicle){
   switch (Vehicle){
    case "Scooter":
     return new Scooter();
    case "Bike":
     return new Bike();
    default:
    return new Scooter();
  }
 }

 class Program{
  static void Main(string[] args){
   IVehicleFactory factory = new ConcreteVehicleFactory();
   IFactory scooter = factory.GetVehicleType("Scooter");
   scooter.VehicleType("Scooter");

   IFactory bike = factory.GetVehicleType("Bike");
   bike.VehicleType("Bike");

   Console.ReadKey();
 }
}

Abstraktes Fabrikmuster:

interface IVehicleFactory{
 IBike GetBike();
 IScooter GetScooter();
}

class HondaFactory : IVehicleFactory{
     public IBike GetBike(){
            return new FZS();
     }
     public IScooter GetScooter(){
            return new FZscooter();
     }
 }
class HeroFactory: IVehicleFactory{
      public IBike GetBike(){
            return new Pulsur();
     }
      public IScooter GetScooter(){
            return new PulsurScooter();
     }
}

interface IBike
    {
        string Name();
    }
interface IScooter
    {
        string Name();
    }

class FZS:IBike{
   public string Name(){
     return "FZS";
   }
}
class Pulsur:IBike{
   public string Name(){
     return "Pulsur";
   }
}

class FZscooter:IScooter {
  public string Name(){
     return "FZscooter";
   }
}

class PulsurScooter:IScooter{
  public string Name(){
     return "PulsurScooter";
   }
}

enum MANUFACTURERS
{
    HONDA,
    HERO
}

class VehicleTypeCheck{
        IBike bike;
        IScooter scooter;
        IVehicleFactory factory;
        MANUFACTURERS manu;

        public VehicleTypeCheck(MANUFACTURERS m){
            manu = m;
        }

        public void CheckProducts()
        {
            switch (manu){
                case MANUFACTURERS.HONDA:
                    factory = new HondaFactory();
                    break;
                case MANUFACTURERS.HERO:
                    factory = new HeroFactory();
                    break;
            }

      Console.WriteLine("Bike: " + factory.GetBike().Name() + "\nScooter: " +      factory.GetScooter().Name());
        }
  }

class Program
    {
        static void Main(string[] args)
        {
            VehicleTypeCheck chk = new VehicleTypeCheck(MANUFACTURERS.HONDA);
            chk.CheckProducts();

            chk= new VehicleTypeCheck(MANUFACTURERS.HERO);
            chk.CheckProducts();

            Console.Read();
        }
    }

Überprüfe hier: http://www.allapplabs.com/java_design_patterns/abstract_factory_pattern.htmEs scheint, dass die Werksmethode eine bestimmte Klasse (nicht abstrakt) als Basisklasse verwendet, während abstrakte Fabrik dafür eine abstrakte Klasse verwendet. Auch wenn die Verwendung einer Schnittstelle anstelle einer abstrakten Klasse verwendet wird, ist das Ergebnis eine andere Implementierung des abstrakten Fabrikmusters.

:D

Abstract Factory ist Vorlage zum Erstellen verschiedener Arten von Schnittstellen. Nehmen wir an, Sie haben ein Projekt, bei dem Sie verschiedene Arten von CSV -Dateien analysieren müssen, die Menge, Preis und identifizierte Informationen enthalten, wie einige Daten zu Früchten Andere über Pralinen und dann müssen Sie diese Informationen nach der Parsen in ihrer entsprechenden Datenbank aktualisieren, damit Sie jetzt haben können, dass Sie jetzt haben können Eine abstrakte Fabrik, die Sie mit Parser- und Modifikatorfabrik zurückgibt, und dann kann diese Parser -Fabrik Ihr Schokoladen -Parser -Objekt, Obst -Parser -Objekt usw. zurückgeben, und ähnlich Modifikator -Fabrik kann Schokoladenmodifikatorobjekt, Fruchtmodifikator -Objekt usw. zurückgeben. Objekt usw.

Ich denke, wir können den Unterschied zwischen diesen beiden verstehen, indem wir einen Java8 -Beispielcode sehen:

  interface Something{}

  interface OneWhoCanProvideSomething {
     Something getSomething();
  }

  interface OneWhoCanProvideCreatorsOfSomething{
     OneWhoCanProvideSomething getCreator();
  }


public class AbstractFactoryExample {

    public static void main(String[] args) {
        //I need something
        //Let's create one
        Something something = new Something() {};

        //Or ask someone (FACTORY pattern)
        OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeA = () -> null;
        OneWhoCanProvideSomething oneWhoCanProvideSomethingOfTypeB = () -> null;

        //Or ask someone who knows soemone who can create something (ABSTRACT FACTORY pattern)
        OneWhoCanProvideCreatorsOfSomething oneWhoCanProvideCreatorsOfSomething = () -> null;

        //Same thing, but you don't need to write you own interfaces
        Supplier<Something> supplierOfSomething = () -> null;
        Supplier<Supplier<Something>> supplierOfSupplier = () -> null;
    }

}

Nun ist die Frage, welche Art der Erstellung Sie verwenden sollten und warum: Der erste Weg (kein Muster, einfach nur Konstruktor): Erstellen von sich selbst ist keine gute Idee, Sie müssen die ganze Arbeit erledigen, und Ihr Client -Code ist gebunden die besondere Implementierung.

Der zweite Weg (mithilfe von Fabrikmuster): bietet Ihnen den Vorteil, dass Sie jede Art von Implementierung übergeben können, die unterschiedliche Art von etwas basierend auf einer Bedingung liefern kann (möglicherweise ein Parameter, der an die Erstellungsmethode übergeben wird).

Der dritte Weg (unter Verwendung eines abstrakten Fabrikmusters): Auf diese Weise gibt es Ihnen mehr Flexibilität. Sie können verschiedene Arten von Erstellern von etwas finden, das auf einer Bedingung basiert (möglicherweise ein Parameter übergeben).

Beachten Sie, dass Sie immer mit dem Werksmuster davonkommen können, indem Sie zwei Bedingungen miteinander kombinieren (was die Code -Komplexität und die Kopplung leicht erhöht). Deshalb sehen wir selten reale Anwendungsfälle von abstraktem Fabrikmuster.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top