El patrón singleton es uno de los patrones de diseño más simples. Una clase que usa el patrón de diseño singleton tiene una sola instancia que administra por sí misma. Esta clase evita que cualquier otra clase cree una instancia de ella.
Una clase singleton también proporciona un único punto de acceso global a la instancia que crea. Entonces, cualquier clase que quiera una instancia de una clase singleton, necesita acceder a ella a través de su único punto de acceso.
El excelente soporte de Java para la programación orientada a objetos facilita el uso del patrón de diseño singleton.
Implementando el patrón Singleton usando Java
Hay muchas formas de implementar el patrón singleton en Java; los enfoques ansiosos y perezosos son variaciones comunes. Cada uno de estos enfoques tiene sus propios méritos e inconvenientes. Por lo tanto, el método que elija emplear debe depender de cómo funcionará su aplicación.
El enfoque entusiasta
Implementar el patrón singleton con el enfoque ansioso significa que la clase crea una nueva instancia de sí misma cuando se carga.
públicoclaseAnsiosoSingleton{
privadoestático Instancia EagerSingleton = nuevo AnsiosoSingleton();privadoAnsiosoSingleton(){}
públicoestático AnsiosoSingleton obtener Instancia(){
devolver instancia;
}
}
El AnsiosoSingletonclase Java crea una nueva instancia de sí mismo a medida que se carga. Asigna esta instancia a la estática privada. Instancia variable, que solo es accesible dentro de la clase singleton. El único punto de acceso externo a la variable de instancia es a través del obtener Instancia() método. Ese método devuelve la instancia de la clase creada previamente.
Este enfoque es excelente ya que evita que el subprocesamiento múltiple problema, que es uno de los mayores desafíos del patrón singleton. Resuelve el problema de subprocesos múltiples al crear una nueva instancia de sí mismo antes de que cualquier subproceso nuevo pueda acceder a su variable de instancia. Esto garantiza que cada subproceso solo tendrá acceso a la misma instancia.
Sin embargo, el enfoque entusiasta solo es práctico si su aplicación utilizará una instancia de la clase singleton cuando comience a ejecutarse. De lo contrario, creará un objeto antes de que su aplicación lo necesite, utilizando recursos innecesariamente.
El enfoque perezoso
El enfoque perezoso es la solución al problema del enfoque ansioso. Le permite crear una nueva instancia de una clase singleton solo cuando su programa lo necesita.
públicoclaseLazySingleton{
privadovolátilestático instancia LazySingleton;privadoLazySingleton(){}
públicoestático LazySingleton obtener Instancia(){
si (ejemplo == nulo) {
sincronizado (LazySingleton.clase) {
si (ejemplo == nulo) {
instancia = nuevo LazySingleton();
}
}
}
devolver instancia;
}
}
El enfoque perezoso resuelve el problema de subprocesos múltiples utilizando el sincronizado palabra clave. Esto evita que dos subprocesos obtengan acceso a la variable de instancia al mismo tiempo. Sin embargo, la sincronización es costosa, por lo que la aplicación solo la usa una vez, cuando llama por primera vez a getInstance().
Cuándo usar el patrón Singleton
El patrón Singleton es útil en muchos escenarios, para crear cuadros de diálogo, controlar la configuración del registro o administrar grupos de subprocesos.
Otro uso común para el patrón singleton es crear una clase central que administre las conexiones de la base de datos.