El patrón de diseño Factory Method (Método Fábrica) sirve para abstraer el proceso de creación de un objeto. A raíz de una clase se crearían todos los objetos con las propiedades y funciones tanto del objeto padre como de los hijos. Forma parte de los patrones de diseño creacionales.
En este ejemplo vamos a suponer que tenemos un objeto User que podrá ser de dos tipos, Normal y Premium. En función del tipo de usuario tendrá un estado diferente y mostrará o no anuncios.
Kotlin
Diagrama de flujo:
Estos serían los dos tipos de usuarios con las diferentes implementaciones de las funciones.
Para facilitar la comprobación de los diferentes usuarios, utilizaremos un Enum llamado UserType:
Para obtener ahora un usuario utilizaríamos la fabrica UserFactory, la cual nos instanciará un objeto en función del tipo, del nombre y del apellido:
Aquí puedes ver como utilizar la UserFactory y para ver el código al completo pulsa en el ‘+’ a la derecha.
Java
Clase Main:
public class Main {
public static void main(String[] args) {
User normal = UserFactory.getUser(UserType.Normal, "James", "Smith");
System.out.println(normal.getFullName());
System.out.println(normal.status());
System.out.println(String.format("Show ads: %s", normal.showAds()));
User premium = UserFactory.getUser(UserType.Premium, "Peter", "Brown");
System.out.println(premium.getFullName());
System.out.println(premium.status());
System.out.println(String.format("Show ads: %s", premium.showAds()));
}
}La clase Factory UserFactory:
public class UserFactory {
public static User getUser(UserType userType, String name, String surname) {
switch (userType) {
case Normal: return new Normal(name, surname);
case Premium: return new Premium(name, surname);
default: return new Normal(name, surname);
}
}
}La interfaz User:
public interface User {
String getFullName();
String status();
boolean showAds();
}Enum Polygon:
public enum UserType {Normal, Premium}Las clases Normal y Premium:
public class Normal implements User {
private String name;
private String surname;
public Normal(String name, String surname) {
this.name = name;
this.surname = surname;
}
@Override
public String getFullName() {
return String.format("%s %s", name, surname);
}
@Override
public String status() {
return "Normal";
}
@Override
public boolean showAds() {
return true;
}
}
public class Premium implements User {
private String name;
private String surname;
public Premium(String name, String surname) {
this.name = name;
this.surname = surname;
}
@Override
public String getFullName() {
return String.format("%s %s", name, surname);
}
@Override
public String status() {
return "Premium";
}
@Override
public boolean showAds() {
return false;
}
}Como veis hay hacerlo en 6 archivos mientras que en Kotlin podríamos hacerlo en 1 (2 o 3 en un caso real). Eso sin contar la diferencia total de líneas.
Enlaces de interés:






