El patrón Instancia Única, o Singleton, es un patrón de diseño creacional que te permite asegurarte de que una clase tenga solo una instancia. Al mismo tiempo te proporciona un punto de acceso global a esta instancia.

¿Qué problema resuelve el patrón instancia única?

El patrón instancia única resuelve dos problemas al mismo tiempo. Ojo, pues esto significa que viola el Principio de Responsabilidad Única:

  1. Asegura que una clase tenga una sola instancia. Resulta que controlar cuántas instancias tiene una clase te permite controlar el acceso a algún recurso compartido como una base de datos.
  2. Proporciona un punto de acceso global a esa instancia. El patrón Singleton te permite acceder a algún objeto desde cualquier parte del programa, como una variable global, pero también protege esa instancia de ser sobrescrita por otro código.

¿Cómo lo hace?

Pues, el patrón instancia única lo hace mediante los siguientes dos pasos en común:

  • Hace que el constructor predeterminado sea privado (especial en algunos lenguajes de programación) para evitar que otros objetos usen el operador new con la clase de Instancia Única.
  • Crea un método de creación estático que actúe como constructor. El método llama al constructor privado para crear un objeto y lo guarda en un campo estático. Todas las siguientes llamadas a este método devuelven el objeto almacenado en caché, y siempre se devuelve el mismo objeto.

¿Cuándo usar el patrón Instancia Única (Singleton)?

Podrías utilizar el patrón Instancia Única cuando una clase de tu programa debe tener una única instancia disponible para todos los clientes. Un ejemplo real sería el si estás desarrollando software para el Gobierno de cierta Administración - sólo hay uno -, pues tendrías un solo objeto de base de datos compartido por diferentes partes del programa.

También podrías utilizar el patrón Instancia Única cuando necesites un control más estricto sobre las variables globales. A diferencia de las variables globales, este patrón garantiza que solo hay una instancia de una clase.

Pros y contras del patrón instancia única

Los siguientes son algunos de los “pros y cons” de este patrón. Contrario a los patrones que vimos en las semanas anteriores verás que este tiene muchos más puntos en contra:

Pros

Contras

  • Puedes estar seguro de que una clase tiene sólo una instancia

  • Obtienes un punto de acceso global a esa instancia

  • El objeto de instancia única se inicializa sólo cuando se solicita por primera vez

  • Viola el Principio de Responsabilidad Única.

  • Puede enmascarar un mal diseño (los componentes del programa pueden saber demasiado unos de otros)

  • Requiere un tratamiento especial en un entorno de subprocesos múltiples para que varios subprocesos no creen un objeto único varias veces

  • Puede ser difícil realizar pruebas unitarias del código de cliente de Instancia Única 

“Show me the code”

Si quieres ver cómo funciona el patrón instancia única, puedes echar un vistazo al ejemplo en PHP de refactoring.guru.

En este ejemplo, del “mundo real”, podrás ver cómo se usa el patrón Singleton para controlar recursos compartidos. Algunos casos son el objeto de registro global que tiene que controlar el acceso a un archivo de registro, o el almacenamiento de configuración de tiempo de ejecución compartido.

Verás también que el el constructor no puede ser público, pero como queremos permitir subclases, tampoco puede ser privado.

De todas formas, a pesar de sus posibilidades, creo que es muy importante recordar que muchos desarrolladores consideran que el patrón Singleton es un antipatrón y por eso su uso está en declive en PHP.

¿Utilizas el patrón Singleton en tus proyectos? ¿Qué tal la experiencia? ¡Coméntalo abajo!

Fuente:

Compartir es construir