Avendo finalmente iniziato seriamente a cercare di apprendere alcuni schemi di base (molto tardi nella carriera, ma questa “è una storia diversa), sto cercando di ottenere il mio aggirare le differenze tra Factory Pattern e Abstract Factory.
Quali sono le differenze chiave tra questi due pattern?
Capisco che il Factory Method crea oggetti attraverso lereditarietà 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.
Commenti
Risposta
Il Metodo di fabbrica è solitamente classificato da unistruzione 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 sullimplementazione.
Pensa a una fabbrica di validatori di carte di credito che restituisce un diverso validatore 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"); } }
Abstract Factory è dove hai più classi di fabbrica concreta (non metodi di fabbrica) derivate da ununica interfaccia che può restituire molti tipi diversi da metodi diversi.
Pensa a un game manager di scacchi con una classe diversa per ogni insieme 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, è spesso selezionata utilizzando un metodo di fabbrica, ma non è necessario combinarli, quindi è il suo modello.
Commenti
- La spiegazione del metodo Factory è corretta? Di cosa si tratta ' " Il pattern del metodo factory si basa sullereditarietà, poiché la creazione di oggetti è delegata a sottoclassi che implementare il metodo factory per creare oggetti ". Quindi lesempio è più simile a Static Factory.
- @SerG Bene, in tutta onestà, ' hai preso quella citazione da Wikipedia, su una pagina che leggeva molto diversamente tre anni fa. Direi che lattuale pagina di Wikipedia si contraddice in diversi punti, ma ' non ho il desiderio di essere coinvolto nella scelta di questo aspetto. Quello che vorrei ammettere, col senno di poi, è che lesempio che ' ho fornito qui è un tipo specifico di Factory Method, noto come Parameterized Factory Method. Ma il punto sulla differenza tra Factory Method e Abstract Factory vale per tutti i tipi di Factory Method.
- La stessa affermazione della mia citazione esiste in GoF " Design Patterns ". E qui viene descritto anche FM parametrizzato.
- La parte importante è che la fabbrica fornirà al chiamante un oggetto adatto, a seconda della situazione particolare, e il chiamante non ' non ha bisogno di sapere quale sia esattamente la classe di quelloggetto, e ' non ha bisogno di sapere come è stato scelto loggetto particolare, purché loggetto supporti uninterfaccia che il il chiamante conosce.
- Dovresti affermare chiaramente nella tua risposta che il tuo esempio non è un tipico pattern di metodo factory, ma una specializzazione chiamata metodo factory parametrizzato. E scrivi sulla definizione del tipico metodo di fabbrica, perché in questo momento è fuorviante. Stavo solo imparando il pattern del metodo di fabbrica, ho capito tutto e poi ho letto quella risposta che mostra il pattern del metodo di fabbrica come qualcosa di diverso ed ero confuso. Non ci sono informazioni su quellesempio che non sia il tipico pattern di metodo di fabbrica. Grazie a SerG per averlo evidenziato nel commento.
new
non è un ' metodo ta (in alcuni sistemi a oggetti, certamente comuni).