Diciamo che ho una classe astratta Drink e un metodo factory che sceglie il tipo di Drink (Wine, Beer, ecc.) Da creare in fase di esecuzione.Passare argomenti a una sottoclasse specifica, tramite un metodo factory
Ogni Drink necessita di alcuni argomenti per inizializzarsi correttamente. Alcuni di questi sono comuni a tutte le bevande; per esempio, potrebbero tutti richiedere un argomento DrinkConfig.
Ma ogni bevanda può avere anche i suoi requisiti specifici. Forse Wine ha bisogno di un oggetto helper Sommelier per inizializzarsi. La birra non ha bisogno di questo, ma potrebbe aver bisogno dei suoi oggetti ausiliari.
Quindi, cosa devo passare al metodo di fabbrica? Quando lo chiamo, ho a disposizione tutti gli oggetti helper, quindi posso passarli tutti in fabbrica. Ma questo potrebbe finire per essere un sacco di argomenti. C'è un modo migliore per progettare questo?
MODIFICA: Supponiamo che non sia possibile creare gli oggetti helper in fabbrica; sono disponibili solo dal chiamante.
Le firme vanno bene. Il problema è come passare argomenti a Factory :: CreateDrink() (o come si chiama). – dirkgently
Se si desidera avere un metodo CreateDrink in fabbrica, è possibile utilizzare un parametro enum per specificare il tipo di bevanda desiderato. Non credo che o l'approccio sopra sia conforme al modello di fabbrica GoF, dove gli oggetti vengono creati nella classe Drink (ho bisogno di controllare il mio libro stasera), ma lo trovo molto più pragmatico e mantiene comunque il vantaggio principale di centralizzazione della creazione di oggetti per le gerarchie di sottoclassi. – sipwiz
Dopo aver controllato il mio libro sui disegni di GoF, sono felice che l'esempio che ho fornito sopra sia quanto vicino a come usi una fabbrica come parte del modello di progettazione di Abstract Factory. Per conformarsi completamente ci dovrebbe essere una classe di fabbrica astratta che DrinkFactory eredita da, ma per casi semplici come questo normalmente la lascio fuori. Sarebbe stato abbastanza facile rifondere DrinkFactory se fosse necessario un altro stabilimento di produzione di calcestruzzo. – sipwiz