No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Singleton 101

3/27
Recursos

¿Qué es el patrón Singleton?

El patrón Singleton es una metodología popular utilizada en la programación orientada a objetos. Su propósito principal es garantizar que solo se pueda crear una única instancia de una clase a lo largo de toda la aplicación. La idea es definir un punto de acceso global para esa instancia, asegurando que no haya variaciones no deseadas y que el recurso compartido sea consistente a través de todo el programa.

Este patrón es tan común que se lo encuentra frecuentemente en diversas bibliotecas, frameworks y módulos que los desarrolladores utilizan día a día. Sin embargo, a pesar de sus ventajas, el Singleton ha sido acusado de ser un antipatrón en ciertas circunstancias, lo que se abordará más adelante.

¿Cuándo utilizar Singleton?

Hay varias situaciones en las que el patrón Singleton puede ser extremadamente útil. Entre ellas:

  • Acceso a recursos compartidos: Necesitamos un recurso que sea el mismo en diferentes partes de la aplicación. Un ejemplo común es el manejo de estado en una aplicación.
  • Modificaciones en un único punto: Queremos asegurarnos de que cualquier modificación al recurso compartido se realice desde un solo lugar, evitando inconsistencias.

Estas dos situaciones retratan el valor del Singleton al configurar un acceso y modificación controlados de recursos en la aplicación.

¿Cómo implementar Singleton?

El patrón Singleton recomienda ciertos pasos para asegurar que solo exista una instancia de una clase:

  1. Constructor privado: Hacer que el constructor de la clase sea privado para evitar que los desarrolladores creen directamente instancias mediante el operador new. Esto se asegura haciendo que solo la propia clase pueda inicializar sus atributos.

  2. Método estático para instanciar: Crear un método estático que actúe como constructor. Este método, por ejemplo getInstance() o createInstance(), se encarga de crear la instancia llamando al constructor privado cuando es necesario.

  3. Variable estática como caché: Almacenar la instancia creada en una variable estática y privada. Cuando se necesita acceder a la instancia, el método estático verifica si ya existe una en esta variable y, de ser así, retorna la misma en vez de crear una nueva.

public class Singleton {
    private static Singleton instance;
    
    private Singleton() {
        // Constructor privado
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

El ejemplo de código anterior demuestra cómo implementar un Singleton en Java. El constructor es privado, evitando instanciaciones directas, y el método getInstance() gestiona la creación y retorno de la única instancia posible.

¿Por qué podría considerarse un antipatrón?

Aunque Singleton ofrece beneficios claros, también presenta potenciales inconvenientes que pueden aterrizarlo en la categoría de antipatrón en ciertos contextos:

  • Dificultad para pruebas: Al tratarse de una única instancia global, las pruebas unitarias pueden volverse complicadas ya que los estados de las pruebas pueden contaminarse entre sí.
  • Más difícil de extender: Si la aplicación requiere múltiples configuraciones o versiones de una clase, Singleton puede limitar la flexibilidad necesaria.
  • Dependencias globales: Puede inducir a un diseño de software donde predominen las dependencias globales, lo que complica el mantenimiento y ampliación del código.

A pesar de estas advertencias, el uso adecuado de Singleton puede brindar muchas ventajas en términos de eficiencia y consistencia cuando se maneja con cuidado y se implementa en los contextos apropiados.

Al final, el conocimiento y la habilidad de aplicar este patrón de manera eficaz depende del entendimiento de sus beneficios y limitaciones, y de una evaluación cuidadosa de las necesidades de cada proyecto. Continúa practicando y explorando alternativas para convertirte en un experto en patrones de diseño de software.

Aportes 9

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hola comunidad, dejo mis anotaciones de la clase! 💚

¿De que se trata singleton?

En un patron que nos permite asegurarnos que no se pueda crear mas de una instancia de un objeto.

Con esto aseguramos un único punto global de acceso a la instancia.

Este también tiene elementos por los que podría ser conocido como un anti-patrón.

¿A que problemáticas podría dar solución?

  • Cuando queremos asegurar el acceso a un recurso compartido en diferentes partes de la app.

    Suena similar a lo que hace una Biblioteca de Manejo de Estados (Como Vuex, Redux, o NgRx)

  • Cuando queremos que la modificación al recurso compartido se lleve a cabo en un solo punto de acceso.

    Un ejemplo para ello seria crear un método en la clase, donde se pueda modificar el estado interno de ese único objeto.

Solución

  • El patron sugiere hacer privado el constructor de la clase para evitar hacer uso del operador new().
  • Crear un método estático que actué como “constructor” y que tras bambalina llame al constructor privado, para crear un objeto que estará guardado en una variable estática que funcionara como caché.
# 🏢 Patrones creacionales ### Ideas/conceptos claves `Singleton` Un patrón de diseño que garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a esa instancia. `**Factory**` Un patrón de diseño que proporciona una interfaz para crear objetos en una superclase, pero permite a las subclases alterar el tipo de objetos que se crearán. `Abstract Factory` Un patrón de diseño que proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas. `Builder` Un patrón de diseño que separa la construcción de un objeto complejo de su representación, permitiendo la creación de diferentes representaciones del mismo objeto. `Prototype` Un patrón de diseño que permite la creación de nuevos objetos duplicando un objeto existente, llamado prototipo. ### Apuntes * Abstraen el proceso de creación / instanciación de objetos 1. Singleton 2. Factory 3. Abstrct factory 4. Builder 5. Prototype * Las técnicas que proponen los patrones de diseño creacionales, nos ayudan a llevar el proceso de nuevos objetos de una forma más Reusable y Extensible ```md 📌 **RESUMEN:** Los patrones creacionales simplifican y mejoran el proceso de creación de objetos, promoviendo la reutilización y la extensibilidad del código ```
![](https://static.platzi.com/media/user_upload/Patr%C3%B3n%20de%20Dise%C3%B1o%20Singleton%20en%20JavaScript-caa781f6-8d61-449e-9c9d-df5ed2092924.jpg)

Hasta ahora no he salido de JavaScript/TypeScript… sería interesante probar estos patrones en lenguajes basados en clases y no en prototipos.

***SINGLETON*** Patron que asegura una unica instancia a un objeto garantizando un punto global de acceso. - Optimizacion. Recursos compartidos. > Asegura que la modificaciones de software se haga desde un unico punto de acceso - Constructor (C) operador new(). Solucion crear un metodo estatico que actua como C este llamara a C privado que creara y guardara un objeto en una variable estatica ("cache")

Cosa curiosa, en los cursos de backend por allá en los años del cristo; uno puede hacer singleton simplemente haciendo un return en los lenguaje que usan refs en su Compilador/Interprete

Singleton Permite asegurar que no se pueda crear más de una instancia de un objeto. Razones para su uso: * Optimización * Recursos Retos: * Solo 1 objeto compartido * Asegurar que la modificación de un recurso compartido se lleve a cabo en un solo punto * Puede generar muchas dependencias y el editar el código puede ser dificil Soluciones * Sugiere hacer privado el constructor de la clase. * Crear un método estático que actue como "constructor" RESUMEN: Básicamente todo gira alrededor de un solo objeto.
En el contexto de programación y desarrollo de software, una instancia se refiere a un objeto creado a partir de una clase. Una clase puede ser vista como un molde o plantilla que define las propiedades y métodos que sus objetos (o instancias) tendrán. Cuando creas una instancia de una clase, estás creando un objeto real en la memoria con sus propias propiedades y datos únicos. Por ejemplo, si tienes una clase llamada `Coche`, podrías crear varias instancias de esa clase, cada una representando un coche diferente con sus propios atributos como `color`, `marca` y `modelo`.
Me gusta mucho como explica este maestro