Índice

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:

Factory Method kotlin

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:

Menú