Что такое синглтон?
Синглтон — это шаблон проектирования, который позволяет создавать только один экземпляр класса и не более.
Как я могу реализовать синглтон?
Лучший способ понять концепцию — использовать пример.
Допустим, я хочу создать класс, который может иметь только один экземпляр, и я хочу, чтобы этот класс имел две переменные: 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)
и, следовательно, мы не сможем создать новый экземпляр.