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


40

Avendo finalmente iniziato seriamente a cercare di apprendere alcuni schemi di base (molto tardi nella carriera, ma questa è una storia diversa), sto cercando di capire meglio le differenze tra il modello di fabbrica e la fabbrica astratta.

Quali sono le differenze chiave tra questi due schemi?

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



2
Per chiarire, intendi "Metodo di fabbrica" ​​quando dici "Modello di fabbrica"? Se stai parlando dei modelli Gang of Four, non esiste alcun modello Factory, ma ci sono Abstract Factory e Factory Method.
Thomas Owens

Sì - Metodo di fabbrica.
Phil.Wheeler,

3
Ad essere onesti, le due frasi sembrano essere scambiate abbastanza comunemente.
Phil.Wheeler,

1
Ah, metodo di fabbrica. Una soluzione alternativa al fatto che newnon è un metodo (in alcuni - certamente comuni - sistemi di oggetti).
Donal Fellows,

Risposte:


44

Il metodo Factory di solito è 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 è dove hai più classi di fabbrica concrete (non metodi di fabbrica) derivati ​​da un'interfaccia che può restituire molti tipi diversi da metodi diversi.

Pensa a un manager di una partita a 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, proprio come una Strategia, viene spesso selezionata usando un Metodo Fabbrica, ma non è necessario combinarli, quindi è il suo modello.


3
Questa spiegazione del metodo Factory è corretta? Che dire di "Il modello del metodo factory si basa sull'ereditarietà, poiché la creazione di oggetti è delegata a sottoclassi che implementano il metodo factory per creare oggetti". Quindi l'esempio è più simile a Static Factory.
SerG

@SerG Bene, in tutta onestà, hai raccolto quella citazione da Wikipedia, su una pagina che ha letto in modo molto diverso tre anni fa. Direi che l'attuale pagina di Wikipedia si contraddice in diversi punti, ma non ho il desiderio di essere coinvolta nella scelta. Ciò che vorrei ammettere, a ben vedere, è che l'esempio che ho fornito qui è un tipo specifico di Metodo di fabbrica, noto come Metodo di fabbrica con parametri. Ma il punto sulla differenza tra Metodo di fabbrica e Fabbrica astratta vale per tutti i tipi di Metodo di fabbrica.
pdr

2
La stessa affermazione della mia citazione esiste in GoF "Design Patterns". E qui è anche descritta la FM parametrizzata.
SerG

La parte importante è che la factory darà al chiamante un oggetto adatto, a seconda della situazione particolare, e il chiamante non ha bisogno di sapere quale sia esattamente la classe di quell'oggetto, e non ha bisogno di sapere come l'oggetto particolare è stato scelto, purché l'oggetto supporti un'interfaccia di cui il chiamante sia a conoscenza.
gnasher729,

Dovresti affermare chiaramente nella tua risposta che il tuo esempio non è un tipico modello di metodo di fabbrica, ma una specializzazione chiamata metodo di fabbrica parametrizzato. E scrivi sulla definizione del tipico metodo di fabbrica, perché al momento è fuorviante. Stavo solo imparando il modello di metodo di fabbrica, ho capito tutto e poi ho letto quella risposta che mostra il modello di metodo di fabbrica come qualcosa di diverso ed ero confuso. Non ci sono informazioni su quell'esempio che non è il tipico modello di metodo di fabbrica. Grazie a SerG per averlo scritto nel commento.
ctomek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.