Es un patrón de diseño creacional en el cual se encapsulan objetos pertenecientes a una jerarquía de clases.
Utilidad
Al implementar este patrón solo manejaremos un único tipo de objeto, ya que internamente se instanciará el que mejor nos convenga.
Ejemplo
Creamos una estructura de clases. Una clase madre (Animal) que tendrá dos hijas (Cat) y (Dog).
La clase madre tiene que ser abstracta, para que no se pueda instanciar. Incluímos un método abstracto (que será el que definamos en las hijas).
Animal.java
package com.luisgomezcaballero.factory_pattern_demo; public abstract class Animal { public abstract String getSound(); }
Creamos las dos clases hijas haciendo que extiendan de la madre.
Sobreescribimos el método abstracto (haciendo que sea diferente en cada clase, para luego poder comprobar que se devuelve un resultado diferente en cada caso porque estamos instanciando dos clases distintas).
Cat.java
package com.luisgomezcaballero.factory_pattern_demo; public class Cat extends Animal { @Override public String getSound() { return "Miaw"; } }
Dog.java
package com.luisgomezcaballero.factory_pattern_demo; public class Dog extends Animal { @Override public String getSound() { return "Warf"; } }
Ahora, aplicamos el patrón generando una factoría.
AnimalFactory.java
package com.luisgomezcaballero.factory_pattern_demo; public class AnimalFactory { public static Animal getAnimal(String type) { if ("cat".equals(type)) { return new Cat(); } else { return new Dog(); } } }
Y finalmente probamos su funcionamiento en una clase principal.
Main.java
package com.luisgomezcaballero.factory_pattern_demo; public class Main { public static void main(String[] args) { Animal animal1 = AnimalFactory.getAnimal("cat"); System.out.println("animal1 says: " + animal1.getSound()); Animal animal2 = AnimalFactory.getAnimal("dog"); System.out.println("animal2 says: " + animal2.getSound()); } }
Repositorio
El código de este proyecto puede encontrarse en https://github.com/luisgomezcaballero/factory-pattern-demo.
So, what do you think ?