Está en la página 1de 6

SINGLETON

1. Nombre del patrón:

Singleton

2. Clasificación del patrón:

Este patrón es parte de los patrones de diseño creacionales que tratan con los
mecanismos de creación de objetos, intentando crear objetos de manera adecuada a
la situación.

3. Intención:

El patrón Singleton tiene como objetivo asegurar que una clase tenga solo una
instancia y proporcionar un punto de acceso global a ella.

4. También conocido como:

- Patrón de instancia única

5. Motivación (ejemplo de escenario de aplicación)

A veces necesitamos tener solo una instancia de una clase. Por ejemplo, un sistema
puede necesitar un objeto de registro global o un objeto de base de datos compartida.
En tales casos, se requiere controlar el acceso a la instancia de esa clase y asegurarse
de que no se creen instancias adicionales.

Supongamos que tienes una clase que debe tener una única instancia en todo el
sistema, como una clase de registro o una clase de configuración. El patrón Singleton
garantiza que solo exista una instancia de esa clase y proporciona una forma de
acceder a ella globalmente.

6. Aplicabilidad:

El patrón Singleton es adecuado en los siguientes casos:

✓ Cuando solo se necesita una única instancia de una clase en todo el sistema.
✓ Cuando se necesita un punto de acceso global a esa instancia única.
7. Estructura y clases participantes:

Singleton: Esta entidad abstracta representa la clase que tiene solo una instancia y
proporciona un método para acceder a ella. El Singleton suele tener un método
estático llamado getInstance() que devuelve la instancia única de la clase. Además,
puede tener otros métodos y atributos propios según sea necesario. El Singleton se
encarga de mantener la única instancia de la clase y garantizar que no se creen
múltiples instancias de ella. Su rol principal es proporcionar un punto de acceso global
a esa instancia única para que otros objetos puedan utilizarla.

El constructor del Singleton debe ocultarse del código cliente (debe ser declarado de
alcance privado). La llamada al método getInstance() debe ser la única manera de
obtener el objeto de Singleton.

8. Colaboraciones:

• El Singleton es una entidad única en el sistema y se accede a través de su método


estático getInstance(). Otros objetos en el sistema pueden llamar a este método
para obtener la instancia única del Singleton.
• Los objetos que necesitan utilizar la funcionalidad del Singleton se comunican con
él a través de su método getInstance(). Esto permite que los objetos obtengan la
instancia única del Singleton y utilicen sus métodos y atributos según sea
necesario.
• El Singleton es responsable de crear su única instancia y asegurarse de que no
se creen múltiples instancias de la clase. Normalmente, esto se logra mediante la
implementación de una verificación de nulidad en el método getInstance(), donde
se crea la instancia si aún no existe y se devuelve la instancia existente si ya ha
sido creada.

En resumen, las interrelaciones en el patrón Singleton se centran en cómo los objetos


del sistema acceden y utilizan la instancia única proporcionada por el Singleton, y
cómo el Singleton se asegura de que solo exista una instancia de la clase y la
proporciona a los objetos que lo requieren.

9. Consecuencias:

Consecuencias positivas:
• Puedes tener la certeza de que una clase tiene una única instancia.
• Obtienes un punto de acceso global a dicha instancia.
• El objeto Singleton solo se inicializa cuando se requiere por primera vez.

Consecuencias negativas:

• Vulnera el Principio de responsabilidad única. El patrón resuelve dos problemas


al mismo tiempo.
• El patrón Singleton puede enmascarar un mal diseño, por ejemplo, cuando los
componentes del programa saben demasiado los unos sobre los otros.
• El patrón requiere de un tratamiento especial en un entorno con múltiples hilos
de ejecución, para que varios hilos no creen un objeto Singleton varias veces.
• Puede resultar complicado realizar la prueba unitaria del código cliente del
Singleton porque muchos frameworks de prueba dependen de la herencia a la
hora de crear objetos simulados (mock objects). Debido a que la clase Singleton
es privada y en la mayoría de los lenguajes resulta imposible sobrescribir
métodos estáticos, tendrás que pensar en una manera original de simular el
Singleton. O, simplemente, no escribas las pruebas. O no utilices el patrón
SingletonImplementación:

10. Código de ejemplo:

Algunas consideraciones para implementar el patrón Singleton son:

▪ Constructor privado: Declara el constructor de la clase Singleton como privado.


Esto evita que otras clases instancien la clase directamente desde fuera de la
misma.
▪ Atributo estático privado: Mantén un atributo estático privado en la clase
Singleton para almacenar la instancia única de la misma. Esto asegura que la
instancia sea accesible desde métodos estáticos dentro de la clase.
▪ Método estático de acceso: Proporciona un método estático en la clase
Singleton, generalmente llamado getInstance(), que devuelve la instancia única
de la clase. Dentro de este método, verifica si la instancia ya ha sido creada y, de
ser así, devuélvela. Si la instancia aún no existe, crea una nueva instancia y la
devuelve.
▪ Puedes utilizar la técnica de verificación de nulidad o utilizar sincronización
para garantizar la creación segura de la instancia única.
▪ Manejo de concurrencia: Si tu aplicación puede tener múltiples hilos de
ejecución y debes garantizar que solo se cree una instancia única incluso en un
entorno concurrente, considera utilizar sincronización o bloqueo de hilos en el
método getInstance(). Esto asegura que solo un hilo pueda crear la instancia y
los demás hilos esperarán a que esté disponible.
▪ Considera la serialización: Si tu clase Singleton es serializable y necesitas
garantizar que la instancia única se mantenga después de la deserialización,
asegúrate de implementar correctamente los métodos readResolve() y
writeReplace().
▪ Evita la creación temprana de la instancia: No crees la instancia del Singleton
en el momento de la carga de la clase. Es posible que no se necesite realmente
en la ejecución de la aplicación, lo que puede causar una carga innecesaria. En
su lugar, crea la instancia cuando se solicite a través del método getInstance().
En este ejemplo, la clase Singleton tiene un constructor privado para evitar que se
creen instancias directamente desde fuera de la clase. La instancia única se mantiene
en un atributo estático instance.

El método getInstance() es estático y sincronizado para garantizar la creación segura


de la instancia en un entorno concurrente. Dentro de este método, se verifica si la
instancia ya ha sido creada. Si es nula, se crea una nueva instancia. La sincronización
se realiza en la clase Singleton.class para asegurar que solo un hilo pueda crear la
instancia.

Puedes utilizar la implementación del Singleton de la siguiente manera:

Aquí, singleton es la instancia única de la clase Singleton


11. Usos conocidos:

✓ Sistemas de registro: En muchos sistemas, el registro es un componente crítico que


registra eventos, errores y actividad. Para garantizar que haya una única instancia del
registro en todo el sistema y que todos los componentes puedan acceder a él de
manera centralizada, se utiliza el patrón Singleton.
✓ Gestores de bases de datos: En aplicaciones que interactúan con una base de datos,
a menudo se necesita un único objeto de conexión a la base de datos para garantizar
la coherencia y evitar problemas de concurrencia. El patrón Singleton se utiliza para
garantizar que solo exista una instancia del gestor de bases de datos y para
proporcionar un acceso global a esa instancia.
✓ Controladores de impresión: En sistemas que necesitan gestionar y controlar la
impresión de documentos, se utiliza el patrón Singleton para garantizar que solo exista
un controlador de impresión y que los diferentes componentes puedan utilizarlo para
enviar trabajos de impresión.
✓ Cachés de datos: En aplicaciones que utilizan una caché de datos para almacenar y
recuperar información frecuentemente accedida, se utiliza el patrón Singleton para
garantizar que la caché sea única y compartida por todos los componentes del
sistema.
✓ Configuración global: En sistemas donde es necesario acceder a una configuración
global desde diferentes partes del código, se puede utilizar el patrón Singleton para
garantizar que la configuración sea única y accesible de manera centralizada.Estos
ejemplos ilustran cómo se utilizan los métodos de fábrica en aplicaciones prácticas, lo
que permite la creación de objetos flexibles y encapsula una lógica de creación de
instancias compleja. El uso de métodos de fábrica ayuda a lograr modularidad,
extensibilidad y mantenibilidad en los sistemas de software.

12. Patrones relacionados:

El patrón Singleton tiene algunas referencias cruzadas con otros patrones de diseño.

✓ Patrón de diseño Factory Method: El patrón Singleton a menudo se combina con el


patrón Factory Method. Puedes utilizar el Singleton para implementar un objeto
Factory que tenga una única instancia y proporcione métodos para crear otros objetos.
Esto asegura que solo exista una instancia del Factory y centraliza la lógica de
creación de objetos.
✓ Patrón de diseño Flyweight: El patrón Singleton puede utilizarse en combinación con
el patrón Flyweight para garantizar que exista solo una instancia de los objetos
Flyweight compartidos. El Singleton se utiliza para gestionar y acceder a las instancias
de los objetos Flyweight, asegurando su unicidad y permitiendo que otros objetos
accedan a ellos de manera centralizada.
✓ Patrón de diseño Observer: El patrón Singleton se puede utilizar en combinación con
el patrón Observer para implementar un objeto observado único que notifique a
múltiples observadores. El Singleton se utiliza para representar el objeto observado y
permite que los observadores se registren y reciban notificaciones desde una única
fuente centralizada.
✓ Patrón de diseño Abstract Factory: El patrón Singleton se puede utilizar en
combinación con el patrón Abstract Factory para garantizar que solo exista una
instancia de una fábrica concreta. Esto asegura que todas las creaciones de objetos
realizadas por la fábrica sigan un mismo contexto y configuración, manteniendo la
consistencia en todo el sistema.

AUTORES: Rodríguez Flores Luis Hernán; Velásquez Miranda Michael Jhordan;


Cárdenas Iglesias Hugo Augusto; Leyva Valqui Gabriel Adolfo; Argomedo Montejo Juan José;
Leyva Sandoval Piero Alejandro; Saldarriaga Urquizo Pedro.

También podría gustarte