Creo que la pregunta que debe hacerse es: ¿Por qué estoy usando un método de Fábrica aquí?
Si la respuesta es "debido a una", y Un es una buena razón, y luego continuar haciéndolo, incluso si esto significa algo de código adicional. Si la respuesta es "no lo sé, porque he oído que se supone que debes hacerlo de esta manera?" entonces deberías reconsiderarlo.
Repasemos las razones estándar para usar fábricas. Esto es lo que Wikipedia says sobre el patrón método de fábrica:
[...], se trata el problema de la creación de objetos (productos), sin especificar la clase exacta del objeto que se va a crear. El patrón de diseño de método de fábrica maneja este problema al definir un método separado para crear los objetos, cuyas subclases pueden anular para especificar el tipo de producto derivado que se creará.
Desde su WidgetFactory es Private
, esto obviamente no es la razón por la que utiliza este patrón. ¿Qué pasa con el "Patrón de fábrica" en sí mismo (independientemente de si lo implementa utilizando un método de fábrica o una clase abstracta)? Una vez más, Wikipedia says:
Uso del patrón de la fábrica cuando:
- La creación del objeto impide la reutilización sin duplicar significativamente código.
- La creación del objeto requiere acceso a información o recursos no apropiados para contener dentro del objeto de composición.
- La gestión de vida de los objetos creados debe centralizarse para garantizar un comportamiento coherente.
Utilizando su código de ejemplo, que no se parece a nada de esto se adapte a su necesidad.Entonces, la pregunta (que solo usted puede responder) es: (1) ¿Qué tan probable es que necesite las características de una fábrica centralizada para sus widgets en el futuro y (2) qué tan costoso sea cambiar todo de nuevo? a un enfoque de fábrica si lo necesita en el futuro? Si ambos son bajos, puede dejar el método Factory de forma segura por el momento.
EDIT: Voy a volver a su caso especial después de esta elaboración genérica: Por lo general, es a = new XyzWidget()
vs a = WidgetFactory.Create(WidgetType.Xyz)
. En su caso, sin embargo, tiene algunos (¿numéricos?) typeId
de una base de datos. Como Mark escribió correctamente, debe tener este typeId -> className
mapa en algún lugar.
Por lo tanto, en ese caso, la buena razón para utilizar un método de fábrica podría ser: "Necesito una especie de enorme ConvertWidgetTypeIdToClassName
caso sentencia de selección de todos modos, así que usar un método de fábrica lleva ningún código adicional más Proporciona las ventajas del método de fábrica de forma gratuita, si alguna vez las necesito ".
Como alternativa, se puede almacenar el nombre de la clase del widget en la base de datos (que probablemente ya tiene algunos WidgetType
mesa con clave primaria typeId
de todos modos, ¿verdad?) Y crear la clase mediante la reflexión (si su idioma permite este tipo de cosa). Esto tiene muchas ventajas (por ejemplo, puede colocar DLL con nuevos widgets y no tiene que cambiar su código CMS principal) sino también desventajas (por ejemplo, "cadena mágica" en su base de datos que no se comprueba en tiempo de compilación; inyección, dependiendo de quién tenga acceso a esa tabla).
+1 Preciso y al grano. –
Gracias por su respuesta. Creo que está lejos de decir que la respuesta a la primera pregunta puede ser "No sé ...". ¿Cuál podría ser un enfoque alternativo a mi método? Necesito crear una subclase diferente de Widget dependiendo del valor de typeId almacenado en la base de datos. – jammus
@jammus: Edité mi respuesta. – Heinzi