martes, 12 de febrero de 2008

Fabricas (GoF) - Creando objetos sin "new" - Factory method

Este patrón define una interfaz para crear un objeto, y deja a las subclases decidir cual clase instanciar.
Programar para las interfaces, NO para la implementación...

Que hay de malo en esta instrucción? : Auto a= new Sedan();

Al usar new() estamos instanciando de una clase concreta, por lo que estaremos programando contra la implementación. Es importante recordar que al acoplar nuestro código a una clase concreta, obtenemos una programación menos flexible y más frágil; o sea con más mantenimiento (y dolor de cabeza incremental) en un futuro propenso al cambio.

Ejemplifiquemos un modelo de nuestro auto:


Ante la creación de objetos de las subclases, es muy común que nuestro código se vea así:Y si tuvieramos que agregar nuevos subtipos de auto, ó eliminar otros?? --> Mayor mantenimiento y código propenso a errores !!

Identificar los aspectos que varían y separarlos de nuestro código...

Esto nos lleva a crear una nueva clase que llamaremos FabricaAutos que tendrá un método CrearAuto(int tipo) :









Con este desarrollo llegamos a un tipo de fábrica que llamaremos "Fábrica simple (simple factory), que si bien no es un patrón de diseño GoF, es una buena técnica creacional de objetos que nos acerca al siguiente patrón : Factory method

Nuestro modelo se complica...

Nuestro cliente de venta de autos (AutoShop) decide expander sus horizontes comerciales fuera de Argentina, específicamente a nuestro hermano pais de Brasil. Resulta que allí los tipos de modelos de auto difieren de los de nuestro pais; por ejemplo supongamos que los autos Rural poseen sólo 2 puertas en Brasil y 4 en Argentina, y las camionetas son doble cabina en Brasil y en Argentina no, etc, etc.
Veamos algunos cambios en nuestro código, comencemos con nuestra clase AutoShop, que ahora será abstracta:





(* protected abstract Auto CrearAuto(...))

Nuestro diagrama de clases con los AutoShops de cada pais:

Como usamos este código para entregar un Auto Sedan de nuestro AutoShop de Argentina?
Simple Factory vs Factory Method (GoF)
Simple factory decide e instancia, no tiene ninguna idea sobre que hacer con el objeto creado.
Factory method delega la creación de la instancia a las subclases, pero sabe que hacer con el objeto creado.

2 comentarios:

Juan Andrés Moreno Schrott dijo...

Muy bueno y aclaratorio. Gracias, un saludo.

Gastón S.D. dijo...

Te hago una consulta.
Por ejemplo si la clase camioneta tuviese un atributo "tracción" para especificar si es 4x2 o 4x4, al declarar la variable de tipo auto, por mas que después el constructor devuelva un new camioneta()al asignarle un valor a este atributo el compilador va a devolver un error del estilo "Auto no tiene una definición para traccion". ¿Esto se contempla en este patrón o estoy buscando por el lado equivocado? Quedo a la espera de tus comentarios. Saludos