El patrón "Fábrica" puede utilizarse en los casos en que el proceso de creación de una instancia de objeto de una clase sea demasiado complicado o deba separarse.
En este patrón hay una interfaz que se implementa por medio de subclases que son utilizadas por una clase de fábrica (en este ejemplo: "TruckFactory"). Si se quiere crear una nueva instancia, entonces hay que llamar a una función (en este ejemplo: "getTruck(String truckManifacturer)" en la instancia de tu clase de fábrica, que te devolverá tu nueva instancia de objeto. La nueva instancia de objeto será referenciada por la super clase que es la interfaz.
A una llamada para crear una instancia de objeto le gustaría esto:
MyFactory myFactory = new MyFactory();
MyObjectSuperClass obj1 = myFactory.getFactoryInstance("MyObjectSubClass");
Pasas el nombre de tu clase en el método de la clase de la fábrica, en lugar de crearlo por el comando "new".
UML diagram
La estructura de la aplicación que se creará para este tutorial de patrones "Fábrica". Un camión tiene la función "start", que implementada de forma diferente por los fabricantes de camiones.
La clase de fábrica "TruckFactory" se utiliza para obtener nuevas instancias de un camión para ciertos fabricantes de camiones.
Example
Este es un ejemplo de aplicación que crea y ejecuta diferentes fabricantes de camiones.
public interface Truck {
void start();
}
public class Volvo implements Truck {
@Override
public void start() {
System.out.println("Volvo truck was started.");
}
}
public class Man implements Truck {
@Override
public void start() {
System.out.println("Man truck was started.");
}
}
public class TruckFactory {
public Truck getTruck(String truckManufacturer) {
if(truckManufacturer != null) {
if(truckManufacturer.equalsIgnoreCase("Volvo")) {
return new Volvo();
} else if (truckManufacturer.equalsIgnoreCase("Man")) {
return new Man();
}
}
return null;
}
}
public class TruckFactoryPattern {
public static void main(String[] args) {
TruckFactory truckFactory = new TruckFactory();
Truck manObj = truckFactory.getTruck("Man");
Truck volvoObj = truckFactory.getTruck("Volvo");
manObj.start();
volvoObj.start();
}
}
Output:
Man truck was started.
Volvo truck was started.
Otros tipos del patrón "Factory"
Método Factory
Este método se utiliza para crear una instancia de la clase de la que se llama este método. Un método de fábrica es siempre un método abstracto.
Fábrica Abstracto
Se trata de una extensión de la aplicación del patrón de fábrica y se utiliza para crear varios tipos de objetos que todavía tienen relación entre sí.
Hay una clase de fábrica abstracta que se extiende por clases de fábrica concretas (subclase). Las clases de fábrica concretas implementan el método o métodos que se definen en la superclase (la clase de fábrica abstracta).
Estas clases de fábrica concreta crean instancias de clases concretas. Las clases concretas contienen los métodos implementados de sus respectivas superclases abstractas.
Este tutorial como aplicación
Github repos: https://github.com/a-dridi/factory-TruckFactoryDemo