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
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