Categories: Patrones Creacionales

Singleton

Share

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

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

fun main() {
    User.printName()
    User.name = "Peter"
    User.printName()
}

object User{
    var name = "John"

    init {
        println("Singleton invoked")
    }

    fun printName() = println(name)
}

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:

Recent Posts

  • Curso Interactivo

Variables

En esta lección aprenderás a declarar variables y los tipos básicos.

5 años ago
  • Curso Interactivo

Introducción al Curso Interactivo

La mejor forma de aprender algo en esta vida es a base de practicar. Espero…

5 años ago
  • Coroutines

Iniciar una Corrutina

La principal forma de iniciar una corrutina en Kotlin es con el coroutine builder launch…

5 años ago
  • Coroutines

Coroutines

Las coroutines en Kotlin vienen a tratar de solucionar todos los problemas y dificultades que…

5 años ago
  • Funciones Estándar

Resumen Elección de Modismo

Con este esquema te puedes guiar a la hora de elegir el modismo o función…

5 años ago
  • Funciones Estándar

With

El último que queda por ver es with qué en inglés significa "con". Por lo…

5 años ago