Singleton Pattern

Паттерн Одиночка для обеспечения единственного экземпляра класса

Паттерн Одиночка (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"