18

Estoy tratando de describir sucintamente cuando para usar una fábrica, tanto para mí como para mi equipo. Me encontré con las siguientes preguntas relacionadas, lo que ayudó un poco:¿Cuándo utilizar el patrón abstracto de fábrica?

Sobre la base de estos enlaces, y un montón de otras fuentes (que aparece en la parte inferior), yo he llegado con lo siguiente:

Al utilizar el resumen patrón de la fábrica:

  • cuando se utiliza un var interfaz o el operador 'nuevo'
    • v.g. Usuario user = new ConcreteUserImpl();
  • y el código que está escribiendo debe ser comprobable/extensible en algún momento

Explicación:

  • las interfaces, por su propia naturaleza implican múltiples implementaciones (bueno para las pruebas unitarias)
  • vars de interfaz implican código compatible con OCP y LSP (subclasificación de soporte)
  • uso de la 'nueva' operador rompe OCP/DI, porque las clases acoplados altamente son difíciles de probar o cambiar

"puedo crear una fábrica para cada tipo de objeto? Eso parece excesivo."

  • no, usted puede tener uno (o unos pocos) fábricas que producen una gran cantidad de (por lo general relacionados) tipos de objetos
  • por ejemplo appFactory.createUser(); appFactory.createCatalog(); etc.

cuándo no usar una fábrica:

  • el nuevo objeto es muy simple y poco probable que sea sub-clasificarse
    • p. List list = new ArrayList();
  • el nuevo objeto no es interesante para probar
    • no tiene dependencias
    • realiza ningún trabajo pertinente o de larga duración
    • por ejemplo, Logger log = new SimpleLogger();

Referencias:


Mi pregunta es: ¿es mi resumen exacto, y ¿tiene sentido? ¿Hay algo que haya pasado por alto?

Gracias de antemano.

+1

¿Por qué está relacionado con Java? ¿No debería ser un lenguaje agnóstico? –

+0

@the_drow: arreglado, gracias. – Luke

+0

Odio revivir viejos hilos, pero ... No estoy de acuerdo en que los registradores se deben actualizar como se indica anteriormente. A menudo ejecuto diferentes registradores en diferentes entornos de prueba. Configuro el entorno para usar un registrador específico e inyectarlo en objetos que se registran. (Incluso podría inyectar arreglos de registradores). – aridlehoover

Respuesta

1

El patrón abstracto de fábrica proporciona una forma de encapsular fábricas de hormigón que comparten algunas características comunes entre sí, lo que significa que implementan la misma clase de interfaz/resumen.

Debe utilizar el patrón de fábrica cada vez que desee controlar la inicialización de sus objetos, en lugar de darle el control al consumidor.

5

También diría que no use una fábrica cuando tenga una implementación en particular que desee. Para continuar el ejemplo List, sé que quiero un ArrayList porque estoy haciendo un acceso aleatorio. No quiero depender de que una fábrica lo haga bien cuando puedo hacerlo yo mismo.

Por el contrario, cuando no quiero saber sobre la subclase concreta, entonces puedo usar una fábrica y dejar que se preocupe sobre qué objeto crear.

Supongo que le sugiero que agregue una viñeta al "cuándo usar el patrón abstracto de fábrica" ​​que dice "y realmente no le importa qué subclase concreta obtiene", y la inversa a "cuando no usar una fábrica ".

EDITAR: Tenga cuidado para evitar el general-purpose tool-building factory factory factory.

+0

Ok, digamos que quería las ventajas específicas de un grupo de subprocesos en caché: ExecutorService pool = Executors.newCachedThreadPool(); Sin embargo, en mis pruebas unitarias (por cualquier razón) no estoy interesado en los resultados del trabajo realizado en el grupo, y no quiero tener que esperar a que el trabajo termine cada vez que ejecuto mis pruebas . ¿No usaría todavía una fábrica para poder probar/simular mi grupo de hilos para las pruebas? Me parece que cuando considere realizar pruebas, desea pensar en ** la mayoría de ** de su código como si no le interesara la implementación real para no escribir un código no comprobable. – Luke

+0

Sí, eso es correcto. En general, la mayoría de su código no se preocupa por la implementación real. Elegir entre 'ArrayList' y' LinkedList' es una de las pocas veces que te importa porque tienen diferentes características de rendimiento. Tiene razón: para las pruebas, es mejor ignorar la implementación real tanto como sea posible. –

+1

+1 solo para el enlace. –

3

En general, úselo cuando desee poder cambiar de implementación mediante una configuración externa.

JDBC y JAXP son excelentes ejemplos. Para ver más ejemplos, marque this answer.

+0

¿No significaría eso usar un contenedor IoC? – dexter

+0

@Max: no necesariamente. – BalusC

+0

¿podría detallar cuándo utilizaría su fábrica personalizada frente a un IoC para cambiar el tipo de objeto por configuración? – dexter

Cuestiones relacionadas