Cidenet+Blog+Desarrollo limpio+Factory Method

Factory Method

¿Qué es?, ¿Qué problema resuelve?

Factory Method o simplemente Factory, es un patrón de diseño creacional que se usa para crear implementaciones concretas de una interfaz común. Por ejemplo, una aplicación requiere que un objeto con una interfaz específica realice sus tareas. La implementación concreta de la interfaz se identifica por un parámetro. En lugar de crear una estructura compleja de condicionales (if/elseif/else) para determinar la implementación concreta, la aplicación delega esa decisión a un componente, aparte, que crea un objeto concreto. Con este acercamiento, el código de la aplicación se simplifica, haciéndolo reusable y más fácil de mantener.

Diagrama

  • Product: Define la interfaz de objetos que el FactoryMethod crea.
  • ConcreteProduct: Implementa la interfaz Product.
  • Creator: Declara el FactoryMethod, el cual retorna un objeto del tipo Product. El Creator también puede definir un método por defecto de implementación.
  • ConcreteCreator: Sobrescribe FactoryMethod para retornar una instancia de ConcreteProduct.

Ejemplo (código antes y código después)

public class FileSerializer {

   public String serialize(Instance instance, String format) {
       if("JSON".equals(format)) {
           return convertJsonToString(instance);
       } else if("XML".equals(format)) {
           return convertXmlToString(instance);
       } else if("YML".equals(format)) {
           return covertYmlToString(instance);
       } else {
           return "Not supported format";
       }
   }

   /**
    * Métodos dummy, acá se hace la lógica como tal de serializar el objeto,
    * bien sea que se haga manual, llamando librerías de terceros, etc
    */
   private String covertYmlToString(Instance instance) {
       return "foo";
   }

   private String convertXmlToString(Instance instance) {
       return "bar";
   }

   private String convertJsonToString(Instance instance) {
       return "meh";
   }

}

En este ejemplo se tiene una clase que convierte un objeto Instance en la representación de un XML, JSON o YML.

Dependiendo del valor que tome format hace la conversión correspondiente.

Un código que usa estructuras condicionales para cambiar el comportamiento de una aplicación es más complejo de mantener y de entender. Es difícil de mantener porque es un código que hace muchas cosas y, de acuerdo al principio de responsabilidad única, se espera que un método tenga una única responsabilidad.

El método serialize puede cambiar debido a:

  • La necesidad de agregar un nuevo formato.
  • Cuando Instance cambie.
  • Cuando la representación de un formato cambie.

Lo ideal sería que si uno de esos cambios ocurre, estos se puedan implementar sin cambiar este método.

Cómo aplicar Factory:

Lo primero que se debe revisar cuando se tiene una estructura condicional compleja, es identificar el fin común en cada uno de los posibles caminos de ejecución. Normalmente, en estas estructuras existe un objetivo común que se logra de diferentes maneras. En este ejemplo, el objetivo es convertir una instancia en un string que representa un formato.

Para aplicar Factory, se siguen los siguientes pasos:

Conclusiones:

  • El patrón es útil cuando se tienen diferentes implementaciones de una misma interfaz.
  • Factory separa lógica compleja que es difícil de mantener en partes atómicas.

El código de ejemplo se puede encontrar en https://bit.ly/2YlCItt

Fuentes

Contáctanos

Déjanos tus datos

    Medellín - Colombia

  • Calle 47D #72-29
  • (+57) 4 3222567
  • comunicaciones@cidenet.com.co

    Estados Unidos

  • 1200 Colorado Blvd, Denver Colorado 80220
  • (+1) 7723619239
  • jceballos@cidenet.net
WhatsApp
>