Cuando piensas en una fabrica que se te viene a la mente? Para mi es un lugar donde las cosas se crean, los productos salen de ella dependiendo de la orden que le enviemos. Justamente de esto se trata este patrón de programación, de crear una fabrica a la cual le podemos hacer un pedido de un objeto y este es devuelto. Es un patrón muy útil para centralizar la construcción de objetos. Existen tres variaciones de este patrón creacional:

  • Simple Factory Pattern Este nos permite crear una interfaz para evitar exponer al usuario la lógica de creación de un objeto.
  • Fatory Method Pattern Esto permite crear interfaces para crear objetos, pero permite que las subclases determinen qué clase instanciar.
  • Abstract Factory Pattern A diferencia de los anteriores patrones, una Abstract Factory es una interfaz para crear objetos relacionados sin especificar o exponer sus clases. También se podría decir que es un patrón que entrega fabricas de objetos.

    El problema:

    Si tenemos que implementar un sistema que modele los Inmueble para una inmobiliaria la forma más básica sería utilizar lo siguiente

    $casa1 = new Inmueble();

    Pero enseguida te darás cuenta que necesitas ser más especifico, en vez de crear un objeto “Inmueble”, necesitaras crear objetos basados en “tiposde_Inmueble” como puede ser departamentos, lotes, chalets, duplex, comercios, etc.. En principio podríamos tener la tentación simplemente de extender la clase Inmueble en cada lugar que necesitemos, con lo cual nuestro código se volverá disperso y difícil de mantener. Y cada vez que se requiera hacer modificaciones en la clase Inmueble el problema se arrastrara hacia todos los lugares donde tenemos extendida esta clase.

    La solución

    En vez de extender la clase Inmueble y utilizar la palabra new en cada lugar donde necesitamos utilizar una propiedad extendida, vamos a optar por utilizar una Simple Factory que se encargara de crear los objetos según se valla necesitando. La siguiente es una implementación sencilla del patrón Simple Factory en PHP:

    Ahora simplemente podemos definir en cada archivo una clase y la factory nos entregara automáticamente un objeto definido que respete la convención tipode_inmueble.php en la carpeta inmuebles. Por ejemplo la siguiente class:

    Por lo tanto ahora podemos crear un nuevo inmueble haciendo uso del siguiente método estático:

    $chalet = inmuebleFactory::build(chalet);

    Conclusión

    En muchas situaciones vamos a encontrar que hacer una dispersión de la palabra clave new hace que nuestro código sea difícil de mantener, el Simple Factory es una buena forma de centralizar todo y que nuestro código sea más sencillo.