it-swarm.dev

Was ist der Unterschied zwischen dem Fabrikmuster und der abstrakten Fabrik?

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, mich mit den Unterschieden zwischen dem Fabrikmuster und der abstrakten Fabrik auseinanderzusetzen.

Was sind die Hauptunterschiede zwischen diesen beiden Mustern?

Ich verstehe, dass die Factory-Methode Objekte durch Vererbung erstellt und Abstract Factory dies durch Objektzusammensetzung, aber aus praktischer Sicht habe ich immer noch Probleme, genau zu visualisieren, wie sie jeweils funktionieren.

40
Phil.Wheeler

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.

Stellen Sie sich eine Kreditkartenprüfungsfabrik vor, die für jeden Kartentyp einen anderen Prüfer zurückgibt.

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");
    }
}

In Abstract Factory haben Sie mehrere konkrete Factory-Klassen (keine Factory-Methoden), die von einer Schnittstelle abgeleitet sind und möglicherweise viele verschiedene Typen von verschiedenen Methoden zurückgeben.

Stellen Sie sich einen Schachspielmanager mit einer anderen Klasse für jeden Satz von Variantenregeln vor.

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 wird, ähnlich wie eine Strategie, häufig mit einer Fabrikmethode ausgewählt, aber es ist nicht erforderlich, sie zu kombinieren, damit es sich um ein eigenes Muster handelt .

45
pdr