Índice

El patrón Singleton se centra en la creación de un objeto único, es decir, en vez de instanciar el mismo objeto muchas veces solo se instanciará una vez, y si ya ha sido instanciado se proporcionará un acceso al mismo.

Es útil para ya que muchas veces no nos interesará que haya dos objetos diferentes. Por ejemplo en ciertas ocasiones en nuestra aplicación tendremos diferentes usuarios, por lo que nos interesará que se puedan crear varias instancias de User para guardarlas en una base de datos. Pero y si nuestra apps solo necesita un usuario ya que su fin es simplemente guardar los datos en memoria del usuario que ha iniciado la sesión, el cual será siempre único, podríamos usar Singleton para evitar tener dos usuarios diferentes los cuales podrían provocarnos un error, ya que recordemos, son los datos de inicio de sesión y solo debería haber un usuario.

Kotlin

Este es el diagrama de flujo de este patrón:

singleton kotlin

Para crear un Singleton en Kotlin solo necesitas esto: object MySingleton

Como puedes verás al ejecutar el código, "Singleton invoked" solo aparecerá una vez aunque hayamos utilizado 3 veces User.

De esta forma tan sencilla tienes tu Singleton en Kotlin además de ser completamente seguro si dos hilos accediesen a la vez al mismo objeto.



Java

En Java sería mucho más laborioso obtener el mismo resultado además de tener que añadir un método específico para evitar problemas al acceder desde dos hilos.

public class Main {
    public static void main(String[] args) {
        User user = User.getInstance();
        user.printName();
        user.name = "Peter";
        user.printName();
    }
}

public class User {

    private static User instance = null;
    public String name = "John";

    private User(){
        System.out.println("Singleton invoked");
    }

    private synchronized static void createInstance() {
        if (instance == null) {
            instance = new User();
        }
    }

    public static User getInstance() {
        if (instance == null) createInstance();
        return instance;
    }

    public void printName() {
        System.out.println(name);
    }
}



Enlaces de interés:

Menú