Está en la página 1de 7

Patrón de Diseño - Singleton

Patrón de diseño Singleton

Es un patrón de diseño diseñado para restringir la creación de objetos


pertenecientes a una clase o el valor de un tipo a un único objeto. Su intención
consiste en garantizar que una clase sólo tenga una instancia y proporcionar un
punto de acceso global a ella.

El patrón singleton se implementa creando en nuestra clase un método que crea


una instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase
no puede ser instanciada nuevamente se regula el alcance del constructor (con
modificadores de acceso como protegido o privado).

La instrumentación del patrón puede ser delicada en programas con múltiples hilos
de ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo
y esta no existe todavía, sólo uno de ellos debe lograr crear el objeto. La solución
clásica para este problema es utilizar exclusión mutua en el método de creación de
la clase que implementa el patrón.

Las situaciones más habituales de aplicación de este patrón son aquellas en las que
dicha clase controla el acceso a un recurso físico único (como puede ser el ratón o
un archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar
disponible para todos los demás objetos de la aplicación.

El patrón singleton provee una única instancia global gracias a que:

• La propia clase es responsable de crear la única instancia.


• Permite el acceso global a dicha instancia mediante un método de clase.
• Declara el constructor de clase como privado para que no sea instanciable
directamente.

Ejercicio:

Vamos a crear una aplicación que nos permita capturar los logs (registros de
actividad en mensajes) de una única sesión de usuario.

1. Creamos un proyecto nuevo con el nombre PDSingleton. Aparecerá la clase


principal con el mismo nombre:

2. Creamos una nueva clase (Java class) para el objeto singleton. Damos el
nombre Logger:

Elaborado por Ing. Duber Jair Rocha Botero Pág. 1


Patrón de Diseño - Singleton

3. En la Clase Logger creamos una constante (static) de tipo privado con valor
nulo y una variable privada para el mensaje que va a manejar el objeto:

4. Creamos el constructor de tipo privado (private). Esto hará que no se pueda


llamar a esta clase desde una clase externa.

5. Creamos el método de tipo público (obtenerInstancia) que será encargado


de crear la instancia o el único objeto de la Clase.

6. Creamos un método (captura) para que el objeto reciba un mensaje

7. Creamos otro método (mostrar) para que retorne el mensaje capturado.

Elaborado por Ing. Duber Jair Rocha Botero Pág. 2


Patrón de Diseño - Singleton

El código completo en la clase Logger es el siguiente:

8. En la Clase principal (main), a manera de prueba, crearemos dos objetos


(prueba1, prueba2) para verificar que, de todas formas, estamos creando
solo una instancia.

9. Vamos a capturar un mensaje en el primer objeto (prueba1) y que muestre el


mensaje desde el segundo objeto (prueba2). Normalmente, habría error al
mostrar el mensaje del segundo objeto, debido a que no se ha almacenado
ningún valor en éste, pero, tratándose de la misma instancia, va a mostrar el
mensaje guardado desde el primer objeto.

Elaborado por Ing. Duber Jair Rocha Botero Pág. 3


Patrón de Diseño - Singleton

El código completo de la Clase principal es el siguiente:

10. Ejecutamos y verificamos el resultado. No habrá ningún error al mostrar el


mensaje del segundo objeto porque se trata de la misma instancia:

Ejercicio:

Realizar un programa implementando el patrón de diseño Singleton, donde se haga


una simulación sencilla de un juego de eliminar marcianos.

Solución:

1. Creamos un nuevo proyecto con el nombre JuegoMarcianos

Elaborado por Ing. Duber Jair Rocha Botero Pág. 4


Patrón de Diseño - Singleton

2. Creamos una clase nueva dentro del proyecto con el nombre Marcianos:

3. Dentro de esta clase creamos el objeto único marcianos el cual iniciará con
una cantidad de 10 marcianos. Se crea el método para derribar o crear
marcianos y para mostrar cuántos marcianos quedan luego del disparo y
determinar si ya ganó por eliminar el total de marcianos.

Elaborado por Ing. Duber Jair Rocha Botero Pág. 5


Patrón de Diseño - Singleton

4. Creamos una nueva clase Computadora que llamará al método


obtenerMarcianos y se encargará de crear los marcianos.

5. Creamos otra clase con el nombre Jugador que se encargará de eliminar los
marcianos.

6. Finalmente, en la clase principal JuegoMarcianos invocamos las tres clases:


Marcianos, Computadora y Jugador. Recibirá datos a través del teclado por
lo que se utilizará Scanner.

Elaborado por Ing. Duber Jair Rocha Botero Pág. 6


Patrón de Diseño - Singleton

7. Al ejecutar,
verificamos el
funcionamiento. Al
terminar con los
marcianos
aparecerá que ha
ganado.

Elaborado por Ing. Duber Jair Rocha Botero Pág. 7

También podría gustarte