Паттерн Одиночка (Singleton Pattern) гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру. Это полезно, когда нужен единственный объект для координации действий во всей системе, например, для управления подключением к базе данных, логирования или конфигурации приложения.
В примере ниже класс HondaCRV реализует паттерн Singleton через статическое свойство instance. При первом вызове
конструктора создается экземпляр и сохраняется в HondaCRV.instance. При последующих вызовах возвращается тот же
экземпляр. Это означает, что все переменные crvInstance1 и crvInstance2 ссылаются на один и тот же объект,
поэтому изменения в одном отражаются в другом.
class HondaCRV {
constructor() {
// Проверяем, существует ли уже экземпляр
if (typeof HondaCRV.instance === 'object') {
return HondaCRV.instance;
}
// Создаем новый экземпляр только если его еще нет
this.name = 'Honda CRV';
this.color = 'Red';
this.speed = 120;
// Сохраняем экземпляр в статическом свойстве
HondaCRV.instance = this;
return this;
}
logCarInfo() {
console.log(`${this.name} - ${this.color} - Speed: ${this.speed} km/h`);
}
increaseSpeed() {
this.speed += 100;
}
changeColor(color) {
this.color = color;
}
}
// Создаем два "разных" экземпляра
const crvInstance1 = new HondaCRV();
const crvInstance2 = new HondaCRV();
// Проверяем, что это один и тот же объект
console.log(crvInstance1 === crvInstance2); // true
// Изменяем скорость через первый экземпляр
crvInstance1.increaseSpeed();
crvInstance1.increaseSpeed();
// Изменяем скорость через второй экземпляр
crvInstance2.increaseSpeed();
crvInstance2.increaseSpeed();
// Оба экземпляра показывают одинаковое состояние
crvInstance1.logCarInfo(); // "Honda CRV - Red - Speed: 420 km/h"
crvInstance2.logCarInfo(); // "Honda CRV - Red - Speed: 420 km/h"
// Изменение цвета через один экземпляр отражается в другом
crvInstance1.changeColor('Blue');
crvInstance2.logCarInfo(); // "Honda CRV - Blue - Speed: 420 km/h"
// Создание третьего "экземпляра" также возвращает тот же объект
const crvInstance3 = new HondaCRV();
console.log(crvInstance3 === crvInstance1); // true
crvInstance3.logCarInfo(); // "Honda CRV - Blue - Speed: 420 km/h"