Si trabajas con JavaScript y quieres escribir código más limpio y reutilizable, dominar los patrones de diseño singleton y factory te dará una ventaja inmediata. Aquí entiendes qué resuelve cada uno, cómo se implementan paso a paso y por qué se usan en herramientas tan comunes como los ORM de Node.js.
Qué es el patrón singleton en JavaScript
El singleton es un patrón de diseño que garantiza que una clase tenga una única instancia en toda tu aplicación. No importa cuántas veces intentes crear un objeto a partir de esa clase, siempre vas a obtener el mismo.
¿Para qué sirve un singleton? Para compartir un único objeto en toda la aplicación, como una conexión a base de datos, un logger o un store global de configuración.
Cómo implementar un singleton paso a paso
La idea central es controlar la creación dentro del constructor. Cada vez que alguien instancie la clase, primero verificas si ya existe una instancia guardada. Si existe, la devuelves; si no, la creas y la almacenas.
El flujo correcto dentro del constructor es:
- Preguntar si ya existe
singletonInstance.
- Si existe, retornar esa misma instancia.
- Si no existe, asignar
singletonInstance = this y retornarla.
javascript
let singletonInstance;
class Singleton {
constructor() {
if (singletonInstance) {
return singletonInstance;
}
singletonInstance = this;
return singletonInstance;
}
setName(name) {
this.name = name;
}
}
const singleton1 = new Singleton();
const singleton2 = new Singleton();
console.log(singleton1 === singleton2); // true
Un detalle importante: si inviertes la lógica del constructor (asignas antes de preguntar), rompes el patrón y la comparación devuelve false. Es un error fácil de cometer cuando aceptas sugerencias de IA sin revisarlas, así que vale la pena revisar la lógica con calma.
Cómo funciona el patrón factory y por qué importa
El factory es lo opuesto al singleton. En lugar de garantizar un único objeto, te permite crear múltiples objetos del mismo tipo de forma controlada a través de una clase intermedia que se encarga de la instanciación.
Este patrón está detrás de muchas herramientas del ecosistema, especialmente los ORM en Node.js, que generan objetos representando registros de base de datos usando este tipo de abstracción.
¿Cuándo uso factory en lugar de instanciar directamente? Cuando necesitas crear varios objetos similares pero con datos distintos, o cuando quieres centralizar la lógica de creación para mantenerla limpia y reutilizable.
Ejemplo de factory con una clase Pet
El ejemplo clásico: una clase Pet que se instancia con un nombre, y una clase PetFactory que se encarga de fabricar mascotas mediante un método createPet.
javascript
class Pet {
constructor(name) {
this.name = name;
}
}
class PetFactory {
createPet(name) {
return new Pet(name);
}
}
const factory = new PetFactory();
const pet1 = factory.createPet("Firulais");
const pet2 = factory.createPet("Michi");
console.log(pet1 === pet2); // false
La comparación entre pet1 y pet2 da false, y eso es exactamente lo que esperas: son objetos del mismo tipo, pero con nombres distintos, así que son instancias diferentes.
Diferencias clave entre singleton y factory
Aunque ambos son patrones creacionales, resuelven problemas opuestos. Tener clara la diferencia te ayuda a elegir el correcto en cada situación.
- Singleton: una sola instancia compartida durante toda la vida de la aplicación.
- Factory: múltiples instancias del mismo tipo, creadas bajo demanda con datos distintos.
- Verificación: en singleton, comparar dos referencias debe dar
true; en factory, debe dar false.
Herramientas recomendadas para escribir mejor JavaScript
Mientras practicas estos patrones, conviene apoyarte en un entorno moderno que acelere tu flujo:
- Windsurf como editor de código con asistencia de IA integrada.
- Warp como terminal con componente de IA para acelerar comandos.
- Brave como navegador con foco en seguridad y privacidad.
En la siguiente clase vas a ver cómo combinar singleton y factory para construir abstracciones más potentes. ¿Ya identificaste en qué parte de tu proyecto actual usarías cada uno? Cuéntame en los comentarios.