🥇 Лучший способ создания паттерна проектирования Singleton в JavaScript и TypeScript

Делимся эффективными методами реализации паттерна Singleton в JavaScript и TypeScript. Кроме того рассмотрим преимущества паттерна и потенциальные риски его использования.

🥇 Лучший способ создания паттерна проектирования Singleton в JavaScript и TypeScript

Что такое паттерн проектирования Singleton?

Паттерн проектирования Singleton гарантирует, что у класса есть только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру. Этот паттерн полезен, когда необходим именно один объект для координации действий в системе.

Паттерн проектирования Singleton
Паттерн проектирования Singleton

Паттерн Singleton используется по нескольким ключевым причинам в разработке программного обеспечения. Вот некоторые из основных преимуществ и случаев использования этого паттерна:

Преимущества Singleton

Контролируемый доступ к единственному экземпляру

Гарантия единственного экземпляра: Обеспечивает, что у класса есть только один экземпляр и предоставляет глобальную точку доступа к нему.

Согласованность: Помогает поддерживать единый источник правды, предотвращая несоответствия и конфликты, которые могут возникнуть из-за наличия нескольких экземпляров.

Управление ресурсами

Ресурсоемкость: Идеален для управления ресурсами, такими как соединения с базой данных, файловые дескрипторы или сетевые подключения, где несколько экземпляров будут неэффективными или проблематичными.

Улучшение производительности: Уменьшает накладные расходы, связанные с частым созданием и уничтожением экземпляров.

Создание паттерна Singleton в JavaScript и TypeScript можно осуществить несколькими способами. Вот подробное руководство, как эффективно реализовать паттерн Singleton:

Управление глобальным состоянием

Централизованная конфигурация: Полезен для управления глобальными состояниями или конфигурациями, которые должны быть согласованными по всему приложению.

Совместное использование состояния: Облегчает совместное использование данных или состояния между различными частями приложения без необходимости передавать экземпляры.

Упрощение структуры кода

Инкапсуляция: Инкапсулирует логику инстанцирования внутри класса, делая код более понятным и легким для сопровождения.

Избежание глобальных переменных: Уменьшает необходимость в глобальных переменных, предоставляя контролируемую точку доступа.

Безопасность потоков

Обработка параллелизма: В многопоточных средах паттерн Singleton может быть спроектирован как безопасный для потоков, гарантируя, что только один экземпляр будет создан, даже при одновременном доступе.

Случаи использования паттерна Singleton

1. Службы логирования

Обеспечивает наличие единственного экземпляра логгера, который обрабатывает все сообщения логов.

2. Управление конфигурацией

Управляет конфигурациями и настройками приложения из одной точки.

3. Соединения с базой данных

Поддерживает одно соединение с базой данных, обеспечивая эффективное использование ресурсов.

4. Управление кэшем

Реализует кэш, который доступен глобально и избегает накладных расходов на создание нескольких экземпляров кэша.

5. Управление пулом потоков

Управляет пулом потоков или рабочих объектов, гарантируя, что пул создается только один раз.

Singleton в JavaScript

Используя классы ES6:

singleton.js
class Singleton {
  constructor() {
    if (!Singleton._instance) {
      Singleton._instance = this;
    }
    return Singleton._instance;
    this.data = 'Hello from Singleton';
  }

  getData() {
    return this.data;
  }
}

const instance1 = new Singleton();
const instance2 = new Singleton();

console.log(instance1 === instance2); // true

Используя Closure:

const Singleton = (function () {
  let _instance;

  function createInstance() {
    const object = new Object('Hello from Singleton');
    return object;
  }

  return {
    getInstance: function () {
      if (!_instance) {
        _instance = createInstance();
      }
      return _instance;
    },
  };
})();

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // true
👨‍💻🎨 Библиотека фронтендера
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека фронтендера»

Singleton в TypeScript

Использую typescript класс и статическое поле

class Singleton {
  private static _instance: Singleton;

  private constructor(args: string[]) {
    // Private constructor to prevent instantiation
  }

  public someMethod(): string {
    return 'I am the instance';
  }

  public static getInstance(args: string[]): Singleton {
    if (this._instance) {
      return this._instance;
    }

    this._instance = new Singleton(args);
    return this._instance;
  }
}

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();

console.log(instance1 === instance2); // true

Ключевые моменты

  1. Паттерн Singleton гарантирует, что у класса есть только один экземпляр и предоставляет глобальную точку доступа к нему.
  2. В TypeScript вы можете использовать закрытый конструктор и статические методы для реализации паттерна Singleton.
  3. В JavaScript замыкания и классы ES6 предлагают простой способ внедрения этого паттерна.

Пример использования: Пул соединений с базой данных

class DatabaseConnection {
  private static _instance: DatabaseConnection;

  private constructor(args: string[]) {
    // Initialize connection
  }

  public connect() {
    // Connect to the database
    console.log('Database connected');
  }

  public static getInstance(args: string[]): DatabaseConnection {
    if (this._instance) {
      return this._instance;
    }

    this._instance = new DatabaseConnection(args);
    return this._instance;
  }
}

// Usage
const db1 = DatabaseConnection.getInstance();
const db2 = DatabaseConnection.getInstance();

db1.connect();
console.log(db1 === db2); // true, same instance

Риск чрезмерного использования: Чрезмерное использование Singleton может привести к тесной связанности кода и затруднить модульное тестирование.

Проблемы с тестированием: Singletons могут быть трудными для тестирования из-за их глобального состояния и потенциальных побочных эффектов.

Итог

Паттерн Singleton является мощным инструментом для управления глобальными состояниями и ресурсами, обеспечивая согласованность и эффективное управление ресурсами в приложении. Однако его следует использовать осторожно, чтобы избежать проблем, связанных с поддерживаемостью и тестируемостью.

Статья-перевод, оригинал находится здесь – jsdev.

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ