Factory Method Java

Iniciado por LKI, Octubre 21, 2014, 02:14:34 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Buenas gente, en este nuevo tutorial tratare de implementar y explicar lo que se conoce como "Factory Method". Veamos que dice la WIKIPEDIA:
CitarEl patrón de diseño Factory Method consiste en utilizar una clase constructora  dedicado a la construcción de objetos de un subtipo de un tipo determinado. Es una simplificación del Abstract Factory, en la que la clase abstracta tiene métodos concretos que usan algunos de los abstractos; según usemos una u otra hija de esta clase abstracta, tendremos uno u otro comportamiento.

Beneficios:

  • Evitamos hardcodear métodos y objetos.
  • Permite desacoplar la implementación de los métodos
  • Abstracción y legibilidad de código
  • Permite la reutilización de código
Manos a la obra..

  • Empezaremos creando un conjunto de clases modelos-bases para poder implementar y explicar nuestro ejemplo:
Código: java




public class Telefono {

//ATRIBUTOS Y METODOS...

public Telefono() {
// MÁS CODIGO POR ACA
}

}


public class Paloma extends Ave{

//ATRIBUTOS Y METODOS...

public Paloma() {
// MÁS CODIGO POR ACA
}

}



public class Reliquia {

//ATRIBUTOS Y METODOS...

public Reliquia() {

// MÁS CODIGO POR ACA
}

}



  • Creamos una interface "Comunicador"
Código: java
public interface Comunicador {

public void enviarMensaje(String mensaje);
}



  • Por ultimo, las clases TelefonoCelular, PalomaMensajera y Telegrafo, cada una hereda de una clase base diferente, pero todas implementan la interface "Comunicador". Por lo tanto heredan y deben sobrescribir el método enviarMensaje();
Código: java

public class TelefonoCelular extends Telefono implements Comunicador {

@Override
public void enviarMensaje(String mensaje) {

//Hacer lo que corresponda aqui

}

}



public class PalomaMensajera extends Paloma implements Comunicador{

@Override
public void enviarMensaje(String mensaje) {

//Hacer lo que corresponda aqui

}

}

public class Telegrafo extends Reliquia implements Comunicador {

@Override
public void enviarMensaje(String mensaje) {

//Hacer lo que corresponda aqui

}


}



  • Luego podriamos hacer algo como lo siguiente:
Código: java


Comunicador c1 = new TelefonoCelular();
Comunicador c2 = new PalomaMensajera();
Comunicador c3 = new Telegrafo();

//E invocar unicamente al metodo enviarMensaje()


Pero la verdadera importancia de todo esto la veremos a continuación:

  • Desacoplamiento de clases:

Supongamos que tenemos una clase utilitaria llamada ComunicadorManager con un metodo estatico crearComunicador:

Código: java

public class ComunicadorManager{

public static Comunicador crearComunicador{

     
      //retornamos cualquier objeto que necesitemos sin afectar en lo mas mínimo al programa ejemplo:
      //return new TelefonoCelular();
     //return new Telegrafo();

   return new PalomaMensajera();
   }
}




  Y utilizando esta clase podriamos escribir un programa como el que sigue:

Código: java


public class MiAplicacionDeMensajes {

public static void main(String[] args) {


Comunicador c = ComunicadorManager.crearComunicador();
c.enviarMensaje("Hola, esto es solo un ejemplo!!");

}

}



En este programa utilizamos la clase ComunicadorManager para obtener "un comunicador" a través del cual enviar nuestro mensaje. Lo interesate de esto es que en el método main no hardcodeamos ninguna de las clases que implementan el la interface Comunicador. Simplemente creamos un objeto comunicador utilizando el método crearComunicador y le invocamos su método enviarMensaje.

  Conclusión:


  • El metodo crearComunicador de la clase ComunicadorManager  nos permitio obtener una instancia de Comunicador sin tener que hardcodear un tipo de comunicador en particular.

  • Gracias a este método nuestro programa (el método main) quedo totalmente desacoplado de la implementación concreta del comunicador y, como vimos más arriba, cualquier objeto que se cree por mas distinto que sea no afecta ni perjudica en lo más mínimo al programa, ya que este esta totalmente separado(desacoplado) de dicha implementación.

  • Decimos entonces que utilizamos  el método crearComunicador para "fabricar objetos comunicadores". Este método constituye una factoría de objetos. A los métodos que realizan este tipo de tareas se los denomina factory.

Fuente: Java a Fondo
por: Ing Pablo Augusto SZnajdleder


Ser mejor cada día es mi meta

=LKI=

Buenisimo bro!!
Me voy a guardar el post en favoritos!

Muchisimas gracias!!
Saludos!
ANTRAX


Para mejorarlo mas todavía, se podria trabajar con un enumerado que contenga los tipos de objetos a crear, y que se pueda utilizar para indicarle a la clase factory que objeto quieres que te devuelva

Saludos