Tengo un requisito para crear algunos objetos que implementan una interfaz determinada, donde el tipo de implementación concreta que se está creando se basa en un valor Enum.¿El patrón de fábrica resolverá mi problema?
Tengo problemas cuando las diferentes implementaciones concretas requieren diferentes parámetros en tiempo de ejecución.
Este ejemplo (C#) está bien:
public enum ProductCategory
{
Modem,
Keyboard,
Monitor
}
public class SerialNumberValidatorFactory()
{
public ISerialNumberValidator CreateValidator(ProductCategory productCategory)
{
switch (productCategory)
{
case ProductCategory.Modem:
return new ModemSerialNumberValidator();
case ProductCategory.Keyboard:
return new KeyboardSerialNumberValidator();
case ProductCategory.Monitor:
return new MonitorSerialNumberValidator();
default:
throw new ArgumentException("productType", string.Format("Product category not supported for serial number validation: {0}", productCategory))
}
}
}
Sin embargo, ¿qué ocurre si las implementaciones concretas tienen diferentes argumentos de constructor? No puedo pasar todos los valores al método SerialNumberValidatorFactory.CreateValidator()
, entonces, ¿cómo procedo?
He oído que el patrón Abstract Factory
se supone que resuelve esto, pero no estoy seguro de cómo implementarlo correctamente.
¿Puede en su lugar agregar los parámetros del constructor en un método de inicialización en la interfaz? Esto te dejará con un constructor sin parámetros. La definición de los parámetros del constructor significará que la persona que llama debe proporcionar los argumentos (a menos que la fábrica pueda proporcionarlos), rompiendo el punto al utilizar una interfaz, ya que la persona que llama ahora está suministrando cosas específicas para una implementación. –
@ Adam, sí, había pensado en eso. Lo único que hace es vigilar la llamada a 'Initialise()'. Al menos con ctor args, son * valores * obligatorios que no puede evitar que pasen. –
Siempre puede agregar una capa más de interfaces, una clase 'Settings' que contiene los argumentos para un tipo determinado. A continuación, puede exponer un 'ISettings' para cada validador que solicite la configuración y pasarlo a la fábrica de clases' CreateValidator'. Esto significa que está pasando valores escritos a otra interfaz, así que supongo que está vinculado a esa interfaz, pero incluso pasando el 'ProductType' su código ya está esperando un cierto tipo, por lo que pasar una determinada interfaz no va a doler. nunca más. –