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:
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.
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.
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.
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.
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é.
Gracias por las notas Alina! :)
Muy buen apunte, gracias
🏢 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
Singleton
Factory
Abstrct factory
Builder
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
📌 **RESUMEN:** Los patrones creacionales simplifican y mejoran el proceso de creación de objetos, promoviendo la reutilización y la extensibilidad del código
muy buena explicación, gracias.
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
jajaja afirmativo Andrés
Me gustaría decir que entendí, pero la vdd es que no :/ i need help
Veo que tienen similitudes, pero creía que el patrón que emplean las librerías de manejo de estado era el Provider. ¿No es así?
Buena pregunta Diego, te propongo lo siguiente:
Cuando hablamos de patrones podriamos trabajar con la idea de existencia de niveles: los de basicos, en donde pondria a los patrones de diseño tradicionales que se abarcaran en estos cursos y los compuestos, en donde residen los patrones que en su composición hacen uso de los basicos.
Teniendo esta division, pondria al provider como un patron compuesto.
Tomando la definicion del patron provider de patterns.dev:
"This is where the Provider Pattern can help us out! With the Provider Pattern, we can make data available to multiple components."
Provider es un patron cuya idea central es la de una estrategia que facilita el acceso de a la informacion, así, sin mas. Ahora bien, el como se implementa esa clase/funcion/elemento que nos va a permitir guardar la informacion y luego acceder a ella, puede llevarse a cabo implementanto un singleton, si lo que se desea es que solo hay una instancia de esa informacion.
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.