Синглтоны в TypeScript


Что такое синглтон?

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

Как я могу реализовать синглтон?

Лучший способ понять концепцию — использовать пример.

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

Сначала я создам класс с именем MyInfo и добавлю приватную переменную instance, которая имеет тип собственного класса.
Как оправдывает себя название, мы будем использовать эту переменную instance для хранения экземпляров нашего класса.

class MyInfo {
  private static instance: MyInfo;
}
Вход в полноэкранный режим Выход из полноэкранного режима

Затем я создам частный метод конструктора. Причина создания приватного конструктора заключается в том, чтобы предотвратить использование new для создания нового экземпляра класса вне класса.

class MyInfo {
  private static instance: MyInfo;
  private constructor(public id: number, public name: string) {}
}
Вход в полноэкранный режим Выход из полноэкранного режима

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

class MyInfo {
  private static instance: MyInfo;
  private constructor(public id: number, public name: string) {}
  static getInstance() {
    if (this.instance) {
      return this.instance;
    } else {
      this.instance = new MyInfo(1, "Musaib");
      return this.instance;
    }
  }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь мы можем реализовать метод getDetails, который регистрирует наши name и id.

class MyInfo {
  private static instance: MyInfo;
  private constructor(public id: number, public name: string) {}
  static getInstance() {
    if (this.instance) {
      return this.instance;
    } else {
      this.instance = new MyInfo(1, "Musaib");
      return this.instance;
    }
  }
  getDetails() {
    console.log(`Hi i'm ${this.name} and my id is ${this.id}`);
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

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

const obj = MyInfo.getInstance();
console.log(obj);
obj.getDetails();
Войти в полноэкранный режим Выход из полноэкранного режима

Вот вывод нашего кода 👇.

Что если я попытаюсь создать другой экземпляр, используя тот же метод getInstance?

На самом деле, вы можете сделать это!
НО, новый экземпляр, который вы создали, будет указывать на ту же область памяти, что и наш старый экземпляр😁.

Что если я все же использую new вне класса?

Если вы попытаетесь создать новый экземпляр класса вне класса, используя new, вы получите ошибку Constructor of class 'MyInfo' is private and only accessible within the class declaration.ts(2673) и, следовательно, мы не сможем создать новый экземпляр.

Оцените статью
devanswers.ru
Добавить комментарий