Factory Method - manu9/patterns GitHub Wiki

El patrón Factory Method permite delegar la responsabilidad de creación de objetos de un tipo determinado a una clase encargada únicamente de devolvernos el objeto del tipo solicitado.

Donde es Aconsejable este Patrón

  • Esto es útil cuando no sabemos al momento de diseñar, que objeto concreto se deberá usar en tiempo de ejecución, por ejemplo cuando creamos una aplicación que no sabemos a que implementación de base de datos el cliente querrá conectar, el podría elegir Oracle o MySQL al momento de instalar la aplicación, en ese instante cuando ingresa en los parámetros MySQL, la aplicación le indicará a la "Fabrica de Objetos de Conexión a base de datos" que le pase la instancia "el objeto" que implementa la conexión a la base de datos MySQL.

  • Cuando queremos delegar a una sola clase la responsabilidad de crear los objetos que se necesiten en tiempo de ejecución.

Representacion Standar UML

Factory Method UML

Ejemplo

public interface Transporte {
	
	public void encender();
	
	public void detener();
	
	public String tipo();

}
public class Automovil implements Transporte {

	@Override
	public void encender() {
		System.out.println("Encendiendo el Automovil...");
	}

	@Override
	public void detener() {
		System.out.println("Deteniendo el Automovil...");
	}

	@Override
	public String tipo() {
		return "Automovil";
	}

}
public class Motocicleta implements Transporte{

	@Override
	public void encender() {
		System.out.println("Encendiendo la Motocicleta...");
	}

	@Override
	public void detener() {
		System.out.println("Encendiendo la Motocicleta...");
	}

	@Override
	public String tipo() {
		return "Motocicleta";
	}

}
public class Fabrica {

	public static Transporte constuir(String tipo) {
		switch (tipo) {
		case "Motocicleta":
			return new Motocicleta();
		case "Automovil":
			return new Automovil();
		default:
			System.out.println("No se encuentra el objeto en la fabrica.");
			return null;
		}
	}
}
public class Example_1 {

	public static void main(String[] args) {
		Transporte t1 = Fabrica.constuir("Motocicleta");
		t1.encender();
		t1.detener();
		System.out.println(t1.tipo());
		
		Transporte t2 = Fabrica.constuir("Automovil");
		t2.encender();
		t2.detener();
		System.out.println(t2.tipo());
	}

}
// Output
// Encendiendo el Motocicleta...
// Encendiendo el Motocicleta...
// Motocicleta
// Encendiendo el Automovil...
// Deteniendo el Automovil...
// Automovil