Nachdem ich endlich ernsthaft versucht habe, einige grundlegende Muster zu lernen (sehr spät in der Karriere, aber das ist eine andere Geschichte), versuche ich, meine zu bekommen Schauen Sie sich die Unterschiede zwischen dem Factory-Muster und der abstrakten Factory an.
Was sind die Hauptunterschiede zwischen diesen beiden Mustern?
Ich verstehe, dass die Factory-Methode Objekte durch Vererbung erstellt und Abstract Factory dies tut es durch Objektzusammensetzung, aber aus praktischer Sicht habe ich immer noch Probleme, genau zu visualisieren, wie sie jeweils funktionieren.
Kommentare
- stackoverflow.com/questions/1001767/…
- Zur Verdeutlichung meinen Sie " Factory-Methode ", wenn Sie " Factory-Muster "? Wenn Sie über das Muster der Viererbande sprechen, gibt es kein Fabrikmuster, aber einen abstrakten Faktor y und Factory-Methode.
- Ja – Factory-Methode.
- Um fair zu sein, scheinen die beiden Sätze ziemlich häufig vertauscht zu sein.
- Ah, Factory-Methode. Eine Problemumgehung für die Tatsache, dass
new
keine ' ta-Methode ist (in einigen – zugegebenermaßen gängigen – Objektsystemen).
Antwort
Die Factory-Methode wird normalerweise durch eine switch-Anweisung kategorisiert, bei der jeder Fall eine andere Klasse zurückgibt und dieselbe Root-Schnittstelle verwendet, sodass der aufrufende Code niemals Entscheidungen über die Implementierung treffen muss.
Denken Sie an eine Kreditkartenvalidierungsfactory Dies gibt für jeden Kartentyp einen anderen Validator zurück.
public ICardValidator GetCardValidator (string cardType) { switch (cardType.ToLower()) { case "visa": return new VisaCardValidator(); case "mastercard": case "ecmc": return new MastercardValidator(); default: throw new CreditCardTypeException("Do not recognise this type"); } }
Die Abstract Factory ist, wo Sie mehrere konkrete Factory-Klassen (nicht Factory-Methoden) haben, die von einer Schnittstelle abgeleitet sind und viele verschiedene Typen von verschiedenen Methoden zurückgeben können.
Stellen Sie sich einen Schachspiel-Manager mit einer anderen Klasse vor für jeden Satz von Variantenregeln.
public class StandardChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new StandardChessBoardMapper(); } public IKingMover GetKingMover() { return new StandardChessKingMover(); } public IMoveClock GetMoveClock() { return new StandardMoveClock(); } } public class HexagonalChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new HexagonalChessBoardMapper(); } public IKingMover GetKingMover() { return new HexagonalChessKingMover(); } public IMoveClock GetMoveClock() { return new StandardMoveClock(); } } public class SpeedChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new StandardChessBoardMapper(); } public IKingMover GetKingMover() { return new StandardChessKingMover(); } public IMoveClock GetMoveClock() { return new SpeedChessMoveClock(); } }
Eine abstrakte Fabrik Ähnlich wie bei einer Strategie wird häufig mit einer Factory-Methode ausgewählt, es ist jedoch nicht erforderlich, sie zu kombinieren, damit es sich um ein eigenes Muster handelt.
Kommentare
- Ist diese Erklärung der Factory-Methode korrekt? Was ' über " Das Factory-Methodenmuster basiert auf der Vererbung, da die Objekterstellung an Unterklassen delegiert wird Implementieren Sie die Factory-Methode, um Objekte " zu erstellen. Das Beispiel ähnelt also eher Static Factory.
- @SerG Nun, fairerweise haben Sie ' dieses Zitat aus Wikipedia auf einer Seite gelesen, die sehr gut gelesen hat vor drei Jahren anders. Ich würde argumentieren, dass sich die aktuelle Wikipedia-Seite an mehreren Stellen widerspricht, aber ich habe ' nicht den Wunsch, mich darauf einzulassen, dies auseinander zu nehmen. Was ich im Nachhinein zugeben würde, ist, dass das Beispiel, das ich ' hier bereitgestellt habe, eine bestimmte Art von Factory-Methode ist, die als parametrisierte Factory-Methode bekannt ist. Der Punkt über den Unterschied zwischen Factory-Methode und Abstract Factory gilt jedoch für alle Arten von Factory-Methoden.
- Es gibt dieselbe Aussage wie in meinem Zitat in GoF " Entwurfsmuster ". Dort wird auch parametrisiertes FM beschrieben.
- Der wichtige Teil ist, dass die Fabrik dem Anrufer je nach Situation ein geeignetes Objekt zur Verfügung stellt und der Anrufer nicht ' muss nicht wissen, was genau die Klasse dieses Objekts ist, und ' muss nicht wissen, wie das bestimmte Objekt ausgewählt wurde, solange das Objekt eine Schnittstelle unterstützt, die das Der Anrufer weiß Bescheid.
- Sie sollten in Ihrer Antwort klarstellen, dass Ihr Beispiel kein typisches Factory-Methodenmuster ist, sondern eine Spezialisierung namens parametrisierte Factory-Methode. Und schreiben Sie über die Definition einer typischen Fabrikmethode, weil sie gerade falsch ist. Ich habe gerade etwas über das Muster der Fabrikmethode gelernt, ich habe alles verstanden und dann die Antwort gelesen, die das Muster der Fabrikmethode als etwas anderes zeigt, und ich war verwirrt. Es gibt keine Informationen darüber, dass dieses Beispiel kein typisches Factory-Methodenmuster ist. Vielen Dank an SerG für den Hinweis im Kommentar.