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

Вы когда-нибудь слышали о шаблонах проектирования? Короче говоря, шаблон проектирования — это многократно используемое общее решение для создания определенных частей нашей программы. Паттерны проектирования можно разделить на три основных типа: творческие паттерны, структурные паттерны и поведенческие паттерны. Прямо сейчас мы сосредоточимся на шаблонах создания, которые сосредоточены на механизмах создания объектов и помогают создавать объекты способом, подходящим для ситуации.

Введение в Синглтон

Давайте поговорим о шаблоне проектирования singleton — очень полезном шаблоне проектирования для творчества. Самое крутое, что это проще всего понять и реализовать! Итак, что такое синглтон? Это похоже на класс, который может быть создан только один раз и доступен глобально. Эта маленькая жемчужина идеально подходит для управления глобальным состоянием.

Мы посмотрим, как может выглядеть Синглтон. Поскольку все мы любим мороженое 🍦, давайте создадим простой IceCreamStore класс, способный:

  • getStock получить обновленный запас в то время.
  • sell уменьшите iceCreamStock в зависимости от введенной суммы.
  • restock противоположность sell . Мы можем увеличить iceCreamStock на основе введенной суммы.
// IceCreamStore.ts

class IceCreamStore {
  private static iceCreamStock: number = 0;

  static getStock() {
    return this.iceCreamStock;
  }

  static restock(amount: number) {
    return (this.iceCreamStock += amount);
  }
  
  static sell(amount: number) {
    return (this.iceCreamStock -= amount);
   }
}

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

private static instance: IceCreamStore;
private static iceCreamStock: number = 0;

private constructor() {
  if (!IceCreamStore.instance) {
    IceCreamStore.instance = new IceCreamStore();
  }

  return IceCreamStore.instance;
}

Добавляя ключевое слово private в метод constructor, мы эффективно предотвращаем создание экземпляра ключевого слова new. Это гарантирует, что новый класс не может быть создан.

Реализовать экземпляр

Ууууу! Мы уже закончили создание нашего IceCreamStore 🎉 Теперь давайте погрузимся в захватывающую часть, давайте попробуем реализовать это в нашем приложении! Сценарий таков: у нас будет две кнопки, кнопка пополнения запасов и кнопка продажи, и для каждой кнопки мы добавим прослушиватель кликов и запустим метод, который мы уже создали ранее.

// RestockButton.ts

import IceCreamStore from './IceCreamStore'

const button = document.querySelector<HTMLButtonElement>('#restock-button')!

button.addEventListener('click', () => {
  
  // restock 20 ice cream
  IceCreamStore.restock(20)

  // print the updated ice cream stock
  const stock = IceCreamStore.getStock()
  console.log(stock)
})
// SellButton.ts

import IceCreamStore from './IceCreamStore'

const button = document.querySelector<HTMLButtonElement>('#sell-button')!

button.addEventListener('click', () => {
  
  // sell 10 ice cream
  IceCreamStore.sell(10)

  // print the updated ice cream stock
  const stock = IceCreamStore.getStock()
  console.log(stock)
})

Когда мы вызываем метод restock для кнопки пополнения запасов и метод sell для кнопки продажи, экземпляр iceCreamStock в IceCreamStore обновляется в обоих файлах. Неважно, нажмете ли вы кнопку пополнения запасов или кнопку продажи, iceCreamStock будет увеличиваться или уменьшаться в зависимости от того, какую функцию вы запускаете. Это возможно, потому что одно и то же значение используется всеми экземплярами.

Компромиссы

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

Краткое содержание

Мы уже изучили очень простой в реализации учебный пример с использованием шаблона Singleton. Таким образом, шаблон Singleton может быть полезным инструментом для управления глобальным состоянием и обеспечения единственного экземпляра класса, но его следует использовать с осторожностью и с учетом конкретных требований и ограничений приложения.

Заключительные слова

Это мой самый первый блог, и очень здорово, что я могу поделиться своими мыслями и тем, что я узнал, со всеми вами, кто читает это. Если вы новичок в разработке шаблонов, я надеюсь, что это чтение даст вам новое понимание 💡. И да, не стесняйтесь обсуждать это в комментариях 💬

Спасибо за прочтение 🚀