Qual è la differenza tra il modello di fabbrica e la fabbrica astratta?

39

Dopo aver finalmente iniziato seriamente a cercare di imparare alcuni schemi di base (molto tardi nella carriera, ma questa è una storia diversa), sto cercando di capire le differenze tra Factory Pattern e Abstract Factory.

Quali sono le differenze chiave tra questi due modelli?

Capisco che il metodo Factory crea oggetti tramite l'ereditarietà e Abstract Factory lo fa attraverso la composizione di oggetti, ma da un punto di vista pratico, sto ancora avendo problemi a visualizzare esattamente come funzionano.

    
posta Phil.Wheeler 06.06.2011 - 11:25
fonte

1 risposta

42

Il Metodo di fabbrica viene solitamente classificato da un'istruzione switch in cui ogni caso restituisce una classe diversa, utilizzando la stessa interfaccia di root in modo che il codice chiamante non debba mai prendere decisioni sull'implementazione.

Pensa a una fabbrica di validatori di carte di credito che restituisce un validatore diverso per ogni tipo di carta.

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

La Fabbrica astratta è il luogo in cui sono presenti più classi di fabbrica concreta (non metodi di fabbrica) derivate da un'interfaccia che può restituire molti tipi diversi da metodi diversi.

Pensa a un gestore di giochi di scacchi con una classe diversa per ogni serie di regole varianti.

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

Una Fabbrica astratta, molto simile a una Strategia, viene spesso selezionata usando un Metodo di Fabbrica, ma non è necessario combinarli in modo tale che sia il suo modello.

    
risposta data 06.06.2011 - 11:49
fonte

Leggi altre domande sui tag