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:
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"
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();
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:
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:
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:
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
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