GoF – Patrones de diseño (VII): Singleton

El siguiente de los patrones que vamos a ver es el de Singleton. Asumo que muchos de vosotros ya lo conoceréis ya que es muy común y muchas clases Java lo implementan, pero había que explicarlo también.

El objetivo de este patrón es asegurarse de que de una clase solo existe una instancia y que esta es accesible, o mejor dicho, ofrecer un punto de acceso a ella.

Existen muchas clases para las cuales es importante tener únicamente una sola instancia que pueda ser utilizada en muchas partes diferentes del sistema. Por ejemplo, por muchas impresoras que haya en nuestro sistema lo interesante es tener una sola cola de impresión que maneje todas las impresiones. Otro ejemplo podría ser un gestor de ventanas de una aplicación, ya que no vamos a tener varios gestores de ventanas para una misma aplicación. Y sin duda, una que todo programador de Java conocerá, la clase Calendar que es un objeto que implementa el patrón Singleton. Si no lo sabías aún, terminad de leer el artículo y os daréis cuenta fácilmente de ello.

Vamos a empezar. Para ello mantengamos dos ideas en la cabeza: tener una sola instancia y que sea accesible desde cualquier parte de nuestra aplicación.

Alguno estará pensando que teniendo variables globales, ¿para qué hace falta este patrón? Pero pensemos que esto hace un objeto accesible desde cualquier lado, pero no nos asegura la existencia de una sola instancia ya que se pueden crear nuevas instancias. El crearlas o no, quedaría en manos de los desarrolladores, lo cual sabemos que es una buena idea siempre.

Algunos de los beneficios que nos aporta el patrón son:

  • Poder controlar el acceso a la instancia.
  • Reduce el espacio de nombres ya que evita contaminarlo con variables globales.
  • Permite refinar operaciones y la representación a través de la creación de subclases.
  • Permite controlar fácilmente y sin apenas cambios el número de instancias que creamos. Sé que el patrón está enfocado a tener una sola instancia, pero en determinadas circunstancias quizás necesitamos dos o tres por ejemplo.

Todo esto está muy bien, pero vamos a ver un poco de código, porque este patrón es tan simple que con un simple vistazo al código lo entenderemos muy fácilmente.

Clase que implementa patrón Singleton:

public class PrintSpooler {
    private static PrintSpooler instance = null;
    protected PrintSpooler() {
        …
    }
    public static PrintSpooler getInstance() {
        if (instance == null) {
            instance = new PrintSpooler();
        }
        return instance;
    }
}

Main:

public class Main {
    public static void main(String[] args) {
        PrintSpooler spooler = PrintSpooler.getInstance();
        …
    }
}

Como podéis ver el constructor del objeto no es accesible y el el método “getInstance” el que gestiona si se ha de crear o no una instancia del objeto, de forma que si ya existe devuelve la instancia existente.

¿Veis ahora la similitud con la clase Calendar de Java?

Hasta aquí hemos llegado con los patrones creacionales. A partir de aquí, en sucesivos artículos empezaremos a ver los patrones estructurales. Nos vemos.

GoF – Patrones de diseño (VII): Singleton

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.