Singleton Pattern е шаблон за проектиране, който ограничава инстанцията на клас до един екземпляр и гарантира, че екземплярът може да бъде лесно достъпен в цялото приложение. Този модел се използва, когато трябва да ограничим броя на екземплярите на клас до едно, като например когато ограничено количество ресурс трябва да бъде споделено в цялото приложение.

Въпреки това, не всичко е слънце и дъги, Singleton Pattern има ограничения. Не е безопасен за нишки, което означава, че ако няколко нишки се опитат да получат достъп до сингълтона едновременно, това може да причини проблеми като условия на състезание и непоследователни данни. Освен това, ако сингълтонът не е внедрен правилно, това може да доведе до изтичане на памет и намалена производителност.

За да разрешим този проблем, можем да използваме статичен метод за функцията getInstance, за да адресираме проблема с безопасността на нишките, като например в примера за клас Logger по-долу. Като правим този метод статичен, ние гарантираме, че само един екземпляр на клас е създаден и достъпен в цялото приложение, дори в многонишкова среда. Това е така, защото статичният метод се извиква само веднъж, така че няма шанс да бъдат създадени множество екземпляри.

class SharedBook {
  private static instance: SharedBook | null = null; // single instance of the book
  private notes: string; // notes made by the book owner

  private constructor() { // private constructor to prevent instantiation
    this.notes = "These are some great notes!"; // initialize notes
  }

  public static getInstance(): SharedBook { // static method to get the instance of the book
    if (!SharedBook.instance) { // check if the book instance has been created
      SharedBook.instance = new SharedBook(); // create the book instance
    }
    return SharedBook.instance; // return the book instance
  }

  public getNotes(): string { // method to get the notes from the book
    return this.notes;
  }
}

// Usage:
const myBook = SharedBook.getInstance(); // get the instance of the shared book
const myNotes = myBook.getNotes(); // get the notes from the shared book
console.log(myNotes); // output: These are some great notes!

В този пример за код на TypeScript класът SharedBook представлява книга, която се споделя между приятели. Методът getInstance() е статичен метод, който създава единичен екземпляр на класа SharedBook и го връща. Методът getNotes() връща бележките, направени от собственика на книгата.

Кодът гарантира, че само един екземпляр от класа SharedBook е създаден и достъпен в цялото приложение, точно както има само една споделена книга, до която всички приятели имат достъп.

Като цяло Singleton Pattern е полезен шаблон за проектиране, който гарантира, че единичен екземпляр на клас е създаден и лесно достъпен в цялото приложение. Може да се прилага на различни места във вашия код, като клас Logger, пул за свързване към база данни, кеширане и пулове от нишки. Използвайки този модел, разработчиците могат ефективно да управляват ресурсите и да подобрят производителността