Cómo trabajar con singletons en JavaScript

Introducción
El singleton es uno de los patrones de diseño más conocidos. Hay ocasiones en las que es necesario tener solo una instancia de una clase y no más. Esta clase podría ser algún tipo de administrador de recursos o alguna búsqueda global de valores. Aquí es donde entran en juego los singletons.
En este artículo, veremos qué son los singletons y cómo implementarlos mejor en JavaScript.
Prerrequisitos
Para completar con éxito este tutorial, necesitará lo siguiente:
- Comprensión de la codificación en JavaScript. Si necesita ampliar sus conocimientos en esta área, consulte esta serie sobre JavaScript .
- Comprender cómo funcionan las clases en JavaScript. Este tutorial sobre cómo comprender las clases en JavaScript puede brindarle esa información.
Entendiendo los Singletons
Los singletons se utilizan para crear una instancia de una clase si no existe o, en caso contrario, devolver la referencia de la existente. Esto significa que los singletons se crean exactamente una vez durante el tiempo de ejecución de la aplicación en el ámbito global.
Según esta definición, los singletons parecen muy similares a las variables globales. Quizás te preguntes por qué se deberían utilizar singletons en un lenguaje de codificación con variables globales. Hay algunas cosas que diferencian a los singletons de las variables globales:
- Las variables globales tienen un alcance léxico, mientras que los singletons no. Esto significa que si hay otra variable con el mismo nombre que la variable global dentro de un bloque de programación, se le da prioridad a la primera referencia. Sin embargo, no se debe volver a declarar esa referencia en el caso de los singletons.
- El valor de un singleton se modifica a través de métodos.
- El singleton no se libera hasta la finalización del programa, lo que probablemente no sea el caso de una variable global.
Incluso en un lenguaje que admita variables globales, los singletons pueden ser muy útiles. Existen situaciones en las que los singletons son prácticos. Algunas aplicaciones de los singletons son los objetos de registro o las clases de configuración.
Declarando Singletons
Hay varias formas de declarar un singleton. Este es un formato que podría ver:
var SingletonInstance = { method1: function () { ... } method2: function () { ... }};
Este singleton se registraría en la consola de la siguiente manera:
console.log(SingletonInstance.method1());console.log(SingletonInstance.method2());
Es bueno tener en cuenta que esta no es la mejor manera de declarar singletons. Otra forma sería usar una clase de fábrica que cree un singleton una vez.
var SingletonFactory = (function(){ function SingletonClass() { // ... } var instance; return { getInstance: function(){ if (!instance) { instance = new SingletonClass(); delete instance.constructor; } return instance; } };})();
Esta es una mejor alternativa al primer ejemplo porque la definición de clase es privada y el constructor se elimina después de la creación de la primera instancia. Esto evitará que se creen singletons duplicados en el programa. La desventaja de este enfoque es que es muy similar al patrón de fábrica.
Existe un tercer enfoque. Este enfoque implementa una combinación de clases ES6 y el Object.freeze()
método:
script.js
class Singleton { constructor() { // ... } method1() { // ... } method2() { // ... }}const singletonInstance = new Singleton();Object.freeze(singletonInstance);
El Object.freeze()
método impide la modificación de las propiedades y los valores de un objeto. Por lo tanto, si Object.freeze()
lo aplicas singletonInstance
, no podrás cambiar ninguna de sus propiedades o valores más adelante en el código.
Puede ir más allá y escribir este singleton como un módulo y exportarlo con la funcionalidad de exportación ES6:
script.js
export default singletonInstance;
Luego, este singleton se podría utilizar en un archivo separado importándolo:
otroArchivo.js
import mySingleton from './script.js';mySingleton.method1();
Con estos tres enfoques para crear singletons, elija el método que mejor se adapte a su caso de uso específico que permita una alta legibilidad.
Conclusión
No siempre es necesario utilizar singletons en el código JavaScript. Utilícelos cuando no afecten al estado de la aplicación. Esta restricción limita gravemente su uso en aplicaciones grandes.
Con este patrón de diseño fundamental en su conjunto de herramientas, es posible que desee explorar los patrones de fábrica en JavaScript . Si está interesado en aprender más sobre la gestión de estados, consulte estos artículos sobre la gestión de estados en React con Redux y la gestión de estados con ganchos de React .
Deja una respuesta