:::: MENU ::::

Patrón Factoría


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 ?