Digamos que tengo una clase abstracta Bebida, y un método de fábrica que elige el tipo de bebida (vino, cerveza, etc.) para crear en tiempo de ejecución.Pasar argumentos a una subclase específica, a través de un método de fábrica
Cada bebida necesita algunos argumentos para inicializarse correctamente. Algunos de estos son comunes a todas las bebidas; por ejemplo, todos pueden requerir un argumento de DrinkConfig.
Pero cada bebida puede tener sus propios requisitos únicos también. Tal vez Wine necesite un objeto auxiliar Sommelier para inicializarse. La cerveza no necesita eso, pero puede necesitar sus propios objetos auxiliares.
Entonces, ¿qué debo pasar al método de fábrica? Cuando lo llamo, tengo todos los objetos auxiliares disponibles, así que podría pasarlos a la fábrica. Pero esto podría terminar siendo una gran cantidad de argumentos. ¿Hay una mejor manera de diseñar esto?
EDIT: Supongamos que no puedo simplemente crear los objetos auxiliares en la fábrica; solo están disponibles para la persona que llama.
Las firmas están bien. El problema es cómo pasar argumentos a su Factory :: CreateDrink() (o como se llame). – dirkgently
Si quería tener un método CreateDrink en la fábrica, podría usar un parámetro enum para especificar qué tipo de bebida quería. No lo creo o el enfoque anterior cumple con el patrón de fábrica de GoF, donde los objetos se crean en la clase de Bebidas (tengo que revisar mi libro esta noche), pero me parece mucho más pragmático y aún mantiene el beneficio principal de centralización de creación de objetos para jerarquías de subclase. – sipwiz
Después de consultar mi libro GoF Design Patterns, me complace que el ejemplo que proporcioné más arriba se asemeje a la forma en que usa Factory como parte del patrón de diseño de Abstract Factory. Para conformarse por completo, debe haber una clase de fábrica abstracta de la que DrinkFactory hereda, pero en casos simples como este, normalmente lo dejo fuera. Sería bastante fácil refactorizar DrinkFactory si se requiriera otra fábrica de concreto. – sipwiz