2010-06-17 10 views
5

Trabajando mi camino a través del libro Head First Design Patterns.¿Cuándo es el método de fábrica mejor que simple de fábrica y viceversa?

Creo que entiendo la fábrica simple y el método de fábrica, pero estoy teniendo problemas para ver qué ventajas aporta el método de fábrica a la simple fábrica.

Si un objeto A utiliza una fábrica sencilla para crear sus objetos B, los clientes pueden crear de esta manera:

A a = new A(new BFactory()); 

mientras que si un objeto utiliza un método de fábrica, un cliente puede crear de esta manera:

A a = new ConcreteA(); // ConcreteA contains a method for instantiating 
         // the same Bs that the BFactory above creates, with 
         // the method hardwired into the subclass of A, ConcreteA. 

Así, en el caso de la fábrica sencilla, los clientes componer una con una fábrica B, mientras que con el método de fábrica, el cliente elige la subclase apropiada para los tipos de B que desea.

Realmente no parece haber mucho para elegir entre ellos. O tiene que elegir con qué Fábrica B quiere componer A, o tiene que elegir la subclase correcta de A para obtener las Bs.

¿En qué circunstancias es mejor uno que el otro?

¡Gracias a todos!

Editar: Añadiendo un poco a la confusión IMO es la explicación dada en la narrativa de Head First donde pasan del método simple de fábrica al de fábrica diciendo (p.119) "las franquicias usaban su fábrica [simple] para crear pizzas , pero comenzando a emplear sus propios procedimientos propios para el resto del proceso: cocinarían las cosas un poco diferente ... "y tienen esa imagen de un chef que aparentemente hizo algo repugnante con sus pizzas.

Pero no hay nada sobre el uso de una fábrica simple que da a los clientes acceso al método de horneado() o cualquiera de las otras partes del proceso. Y no hay nada sobre el uso de un método de fábrica que ayudaría si hubiera algún problema con él.

por lo que parece a mí como la razón por la cabeza primero implica para el uso de un método de fábrica a través de una simple fábrica es falso ..

+0

Veo su punto y me confundí con esto también. Creo que su punto es que cierto comportamiento se puede aplicar en las subclases al implementarlo en la clase base (abstracta). –

Respuesta

1

Compare los diagramas UML en la página 117 y 131. El punto es, así de simple fábrica decide cómo para hornear una pizza para una PizzaStore. El método de fábrica permite que la PizzaFactory concreta decida cómo hornear una pizza. Las fábricas tratan sobre la gestión de dependencias. Usando constructor, debes decidir qué clase instanciar. Usando la fábrica simple, dejas que la clase concreta decida qué clase instanciar. Al usar el método de Fábrica, dejas que cualquier clase (que puede) decida qué clase instanciar. Al usar la fábrica abstracta, dejas que cualquier clase (que puede) decida qué clase instanciar, independientemente del tipo de instancia que quieras crear. La inversión del control está usando lo que obtienes, porque la decisión se tomó cuando la existencia divina te creó.

Mi opinión personal es que el libro original de Design Pattern de GoF, aunque no es tan bueno para explicar, tiene más ejemplos del mundo real.

1

Analice las diferencias en términos de diferentes roles: usuarios de A y proveedores de A. Los patrones tienen diferentes implicaciones para estos roles, estos son significativos ya que las cosas cambian con el tiempo.

En el caso de

A myA = new SomeConcreteA() 

los clientes de un saber nada sobre el hecho de que aún existe Bs. La elección de un determinado concreto A podría estar influenciada por alguna documentación que utilice Bs particulares o algunas características completamente distintas de la familia A. Los proveedores de A se hacen responsables de crear todos los sabores del concreto A, por lo que es probable que tengan trabajo por hacer cuando cambian cosas como los tipos de B.

En el caso de

A myA = new A(myBFactory()) 

El cliente ahora necesita saber sobre B y sus fábricas y tiene un control completo sobre el cual la fábrica para su uso. El proveedor le ha dado al cliente mucha más responsabilidad, y quizás hemos aumentado el acoplamiento: el código del cliente ahora depende explícitamente de al menos una clase más. El proveedor de A no tiene trabajo que hacer cuando aparecen nuevos tipos de B.

Tenga en cuenta que estamos inyectando la fábrica B y, por lo tanto, al escribir pruebas de unidad de cliente ahora podemos proporcionar burlas mucho más fácilmente para Bs, por lo que probar al cliente suele ser más fácil. En general, encuentro que utilizo este método de inyección más frecuentemente por este motivo.

0

Tiene razón en que todo lo que parece cambiar de Simple Factory a Factory Method es que en Simple Factory la fábrica se pasó a través del constructor y lo usamos para crear nuestro objeto. En Factory Method, la llamada ahora es a un método abstracto en nuestra clase abstracta de fábrica; pero esto es poderoso. Como el método es abstracto, deberá implementarse en nuestras subclases, que es lo que deseamos. Nuestras subclases pueden implementar sus propias variaciones, pero nuestra clase abstracta todavía impone cierto comportamiento. Lo que es aún más poderoso es que podemos ampliar el número de fábricas sin modificar el código original simplemente agregando nuevas clases que hereden de la clase base abstracta.

Cuestiones relacionadas