design-patterns - method - patron de diseño abstract factory c#
¿El patrón de Localizador de servicios es diferente del patrón de Abstract Factory? (4)
De: http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/
Una fábrica abstracta es un tipo genérico, y el tipo de devolución del método Crear está determinado por el tipo de fábrica. En otras palabras, un tipo construido solo puede devolver instancias de un solo tipo.
Un localizador de servicios, por otro lado, es una interfaz no genérica con un método genérico. El método Create de un único localizador de servicios puede devolver instancias de un número infinito de tipos.
A primera vista, el patrón de Localizador de servicios tiene el mismo aspecto que el patrón Abstract Factory. Ambos parecen tener el mismo uso (usted los consulta para recibir instancias de servicios abstractos), y ambos han sido mencionados cuando leí sobre Dependency Injection.
Sin embargo, he visto el patrón de Localizador de servicios descrito como una idea pobre , pero he visto soporte directo para el patrón Abstract Factory en al menos un marco principal de inyección de dependencias .
Si no son lo mismo, ¿cuáles son las diferencias?
En realidad, hay una clara separación entre este patrón. Es común saber que ambos patrones se usan para evitar dependencias de tipos concretos.
Sin embargo después de leer
- Desarrollo ágil de software, principios, patrones y prácticas [libro] por Rober C. Martin
- Inversión de los Contenedores de Control y el patrón de Inyección de Dependencia [artículo] por Martin Fowler en http://martinfowler.com/articles/injection.html
- Reconocimiento de patrones: ¿fábrica abstracta o localizador de servicios? [artículo] por Mark Seemann en http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/
- Patrón de diseño [libro] por Erich Gamma et al
Algunas contradicciones severas surgen:
Seemann dijo: "Una Abstract Factory es un tipo genérico, y el tipo de retorno del método Create está determinado por el tipo de la fábrica misma. En otras palabras, un tipo construido solo puede devolver instancias de un solo tipo".
Mientras que Rober C. Martin no mencionó nada acerca de los tipos genéricos y, además, el ejemplo de fábrica en su libro permite crear una instancia de más de un tipo de objetos para distinguirlos utilizando una cadena clave como parámetro en Factory.Make ().
Gamma dijo que la intención de Abstract Factory es "Proporcionar una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas". Vale la pena mencionar que el ejemplo de Gamma Abstract Factory viola el Principio de segregación de interfaz (ISP) establecido por Martin. ISP y SOLID en general son principios más modernos o tal vez por simplicidad cuando se omiten.
Las obras de Gamma y Martin preceden a Seemann, así que creo que debería seguir la definición ya hecha.
Si bien Fowler propone el Localizador de Servicios como una forma de implementar la Inversión de Dependencia, Seemann lo considera como un antipatrón. Ni Gamma ni Martin mencionan el Localizador de servicios.
Sin embargo, Seemann y Fowler estuvieron de acuerdo en que Service Locator necesita un paso de configuración para registrar una instancia de una clase concretes, esa instancia es la que se devolverá más adelante cuando se solicite un objeto de ese tipo. Martin o Gamma no mencionan este paso de configuración en su definición de Abstract Factory. El patrón abstracto de fábrica supone un nuevo objeto para ser instanciado cada vez que se solicita un objeto de ese tipo.
Conclusión
La principal diferencia entre Service Locator y Abstract Factory es que Abstract Factory supone que un nuevo objeto se instancia y se devuelve en cada pedido y Service Locator se debe configurar con una instancia de objeto y cada vez que se devuelva la misma instancia.
Me encontré con la misma pregunta mientras investigaba estos patrones. Creo que las mayores diferencias se pueden encontrar entre un localizador de servicios y una fábrica (ya sea que sea abstracto o no):
Localizador de servicio
- ''Localiza'' una dependencia existente (el servicio). Aunque el servicio puede crearse durante la resolución, no tiene ninguna consecuencia para el Cliente porque:
- El Cliente del Localizador de Servicios NO toma posesión de la dependencia.
Fábrica
- Crea una nueva instancia de una dependencia.
- El cliente de la fábrica se hace cargo de la dependencia.
Fábrica abstracta
- Igual que una Factory normal, excepto que diferentes implementaciones pueden usar diferentes implementaciones de Abstract Factory permitiendo la creación de instancias de diferentes tipos en esas diferentes implementaciones (incluso podría cambiar la implementación de Abstract Factory en tiempo de ejecución, pero esa no es la forma en que se usa).
Por lo que he leído hasta ahora, creo que la diferencia es:
El patrón del localizador de servicios
- Admite explícitamente el registro de qué objetos concretos deben crearse / devolverse
- Por lo general, tiene una interfaz genérica que permite al usuario solicitar cualquier tipo de resumen, en lugar de tipos específicos
- Puede ser concreto
El patrón Abstract Factory
- Es posible que no admita el registro: eso depende de la implementación específica para admitir, o no, y probablemente no esté expuesto en la interfaz abstracta.
- Por lo general, tiene múltiples métodos get para tipos abstractos específicos
- No es en sí mismo concreto (aunque, por supuesto, tendrá implementaciones concretas)