Patrón de diseño Singleton | Introducción

Singleton es parte del patrón de diseño Gang of Four y se clasifica en patrones de diseño creacionales . En este artículo, vamos a profundizar en el uso del patrón Singleton. Es uno de los patrones de diseño más simples en términos de modelado pero, por otro lado, este es uno de los patrones más controvertidos en términos de complejidad de uso.

El patrón Singleton es un patrón de diseño que restringe una clase para instanciar sus múltiples objetos. No es más que una forma de definir una clase. La clase se define de tal manera que solo se crea una instancia de la clase en la ejecución completa de un programa o proyecto. Se utiliza cuando solo se requiere una única instancia de una clase para controlar la acción durante la ejecución. Una clase singleton no debería tener múltiples instancias en ningún caso y a cualquier costo. Las clases Singleton se utilizan para el registro, los objetos del controlador, el almacenamiento en caché y el grupo de subprocesos, las conexiones de la base de datos.

Patrón de diseño único

Implementación de la clase Singleton

Una implementación de la clase singleton debe tener las siguientes propiedades:

  1. Debe tener solo una instancia:  esto se hace proporcionando una instancia de la clase desde dentro de la clase. Se debe evitar que las clases o subclases externas creen la instancia. Esto se hace haciendo que el constructor sea privado en Java para que ninguna clase pueda acceder al constructor y, por lo tanto, no pueda crear una instancia.
  2. La instancia debe ser accesible globalmente:  la instancia de la clase singleton debe ser accesible globalmente para que cada clase pueda usarla. En Java, se hace haciendo público el especificador de acceso de la instancia.
//A singleton class should have public visibility
//so that complete application can use
public class GFG {
    
  //static instance of class globally accessible
  public static GFG instance = new GFG();
  private GFG() {
    // private constructor so that class
    //cannot be instantiated from outside
    //this class
  }
}

Artículo detallado: Implementación del patrón de diseño Singleton en Java

Tipos de inicialización de Singleton

    La clase Singleton se puede instanciar mediante dos métodos:

  1. Inicialización temprana: en este método, la clase se inicializa ya sea que se vaya a usar o no. La principal ventaja de este método es su simplicidad. Usted inicia la clase en el momento de la carga de la clase. Su inconveniente es que la clase siempre se inicializa, ya sea que se use o no.
  2. Inicialización diferida: en este método, la clase se inicializa solo cuando es necesario. Puede evitar que cree una instancia de la clase cuando no la necesita. Generalmente, la inicialización perezosa se usa cuando creamos una clase singleton.

Ejemplos de clase Singleton

  1. java.lang.Runtime: Java proporciona una clase Runtime en su paquete lang que es de naturaleza única. Cada aplicación Java tiene una única instancia de clase Runtime que permite que la aplicación interactúe con el entorno en el que se ejecuta la aplicación. El tiempo de ejecución actual se puede obtener del método getRuntime().
    Una aplicación no puede instanciar esta clase, por lo que no se pueden crear varios objetos para esta clase. Por lo tanto, Runtime es una clase singleton.
  2. java.awt.Desktop: la clase Desktop permite que una aplicación Java inicie aplicaciones asociadas registradas en el escritorio nativo para manejar un URI o un archivo.
    Las operaciones admitidas incluyen:
    • iniciar el navegador predeterminado del usuario para mostrar un URI específico;
      iniciar el cliente de correo predeterminado del usuario con un mailto URI opcional;
    • iniciar una aplicación registrada para abrir, editar o imprimir un archivo específico.
    • Esta clase proporciona métodos correspondientes a estas operaciones. Los métodos buscan la aplicación asociada registrada en la plataforma actual y la inician para manejar un URI o archivo. Si no hay una aplicación asociada o la aplicación asociada no se inicia, se genera una excepción.
    • Cada operación es un tipo de acción representado por la clase Desktop.Action.

    Esta clase tampoco se puede instanciar desde la aplicación. Por lo tanto, también es una clase singleton.

Aplicaciones de las clases Singleton

Hay muchas aplicaciones de patrón singleton como memoria caché, conexión de base de datos, controladores, registro. Algunos de los principales son: –

  1. Acceso a la interfaz de hardware: el uso de singleton depende de los requisitos. Las clases Singleton también se utilizan para evitar el acceso simultáneo de la clase. Prácticamente se puede usar singleton en caso de que se requiera una limitación de uso de recursos de hardware externo, por ejemplo, impresoras de hardware en las que la cola de impresión se puede convertir en singleton para evitar múltiples accesos simultáneos y crear interbloqueos.
  2. Registrador: las clases Singleton se utilizan en las generaciones de archivos de registro. Los archivos de registro son creados por el objeto de clase de registrador. Supongamos una aplicación donde la utilidad de registro tiene que producir un archivo de registro basado en los mensajes recibidos de los usuarios. Si hay varias aplicaciones de clientes que usan esta clase de utilidad de registro, es posible que creen varias instancias de esta clase y esto puede causar problemas durante el acceso simultáneo al mismo archivo de registro. Podemos usar la clase de utilidad del registrador como un elemento único y proporcionar un punto de referencia global para que cada usuario pueda usar esta utilidad y no haya dos usuarios que accedan a ella al mismo tiempo.
  3. Archivo de configuración: este es otro candidato potencial para el patrón Singleton porque tiene un beneficio de rendimiento, ya que evita que varios usuarios accedan y lean repetidamente el archivo de configuración o el archivo de propiedades. Crea una instancia única del archivo de configuración al que se puede acceder mediante varias llamadas al mismo tiempo, ya que proporcionará datos de configuración estáticos cargados en objetos en memoria. La aplicación solo lee el archivo de configuración la primera vez y, a partir de la segunda llamada, las aplicaciones cliente leen los datos de los objetos en memoria.
  4. Caché: podemos usar la caché como un objeto único, ya que puede tener un punto de referencia global y para todas las llamadas futuras al objeto de caché, la aplicación cliente usará el objeto en memoria.

Puntos importantes

  • Las clases Singleton solo pueden tener una instancia y esa instancia debe ser accesible globalmente.
  • java.lang.Runtime y java.awt.Desktop son 2 clases únicas proporcionadas por JVM.
  • El patrón de diseño Singleton es un tipo de patrón de diseño creativo.
  • Se debe evitar que las clases externas creen instancias de clase singleton.

Lectura adicional: Patrón Singleton en Python

Referencias:-
https://en.wikipedia.org/wiki/Singleton_pattern
https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html
https://docs.oracle.com /javase/7/docs/api/java/awt/Desktop.html

Este artículo es una contribución de Vishal Garg . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *