Si está utilizando .NET se podría construir con la reflexión en su lugar. Por ejemplo, si estuviera creando un sistema de plugins, entonces tendría una carpeta a caer DLL de plugin en. Y tu fábrica sería mirar los archivos DLL disponibles, examinar cada uno de los atributos de reflexión apropiadas, a continuación, coinciden con los atributos contra todo lo que se aprobó en cadena para decidir cuál es el objeto de seleccionar e invocar.
Esto evita tener que volver a compilar su aplicación principal, aunque tendrá que crear sus trabajadores en otras DLL y luego tener una forma de decirle a su fábrica cuál usar.
Aquí hay un código de pseudo muy rápido y sucio para conseguir el punto a través de:
Asumiendo que tiene un conjunto de DLL llamada Workers.DLL
Establecer un atributo llamado WorkerTypeAttribute con una propiedad de cadena llamado nombre, y el constructor para poder establecer esa propiedad de Nombre.
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class WorkerTypeAttribute : Attribute
{
string _name;
public string Name { get { return _name; } }
public WorkerTypeAttribute(string Name)
{
_name = Name;
}
}
Se podría entonces aplicar este atributo a una clase trabajadora que ha definido como:
[WorkerType("CogWorker")]
public class CogWorker : WorkerBase {}
Luego, en la fábrica trabajador de su aplicación que iba a escribir un código como:
public void WorkerFactory(string WorkerType)
{
Assembly workers = Assembly.LoadFile("Workers.dll");
foreach (Type wt in workers.GetTypes())
{
WorkerTypeAttribute[] was = (WorkerTypeAttribute[])wt.GetCustomAttributes(typeof(WorkerTypeAttribute), true);
if (was.Count() == 1)
{
if (was[0].Name == WorkerType)
{
// Invoke the worker and do whatever to it here.
}
}
}
}
estoy seguro de que hay otros ejemplos de cómo hacer esto por ahí, pero si usted necesita un poco más punteros, que me haga saber. La clave es que todos los trabajadores deben tener un padre o interfaz común para que se les puede invocar la misma manera. (Es decir, todos los trabajadores necesitan un método común "Ejecutar" o algo que se puede llamar desde la fábrica, o donde quiera que utilizar el objeto.
'TimeSpan.FromHours (4) .Milliseconds' – SLaks
¿Por qué cree que esto es un anti-patrón? –
Cada vez que aparece un nuevo criterio (una versión diferente de la interfaz), entonces el código debe recompilarse y esa declaración if debe expandirse. – Achilles