Каков наилучший и наиболее удобный способ реализовать шаблон Singleton для класса в TypeScript? (Как с отложенной инициализацией, так и без нее).
singleton
typescript
Maja
источник
источник
export default new Singleton()
?Начиная с TS 2.0, у нас есть возможность определять модификаторы видимости в конструкторах , так что теперь мы можем создавать синглтоны в TypeScript так же, как мы привыкли к другим языкам.
Приведен пример:
Спасибо @Drenai за то, что вы указали, что если вы пишете код, используя необработанный скомпилированный javascript, у вас не будет защиты от множественного создания экземпляров, поскольку ограничения TS исчезают, и конструктор не будет скрыт.
источник
Лучший способ, который я нашел:
Вот как вы его используете:
https://codebelt.github.io/blog/typescript/typescript-singleton-pattern/
источник
Следующий подход создает класс Singleton, который можно использовать точно так же, как обычный класс:
каждый
new Singleton()
операция вернет один и тот же экземпляр. Однако это может быть неожиданным для пользователя.Следующий пример более прозрачен для пользователя, но требует другого использования:
Использование:
var obj = Singleton.getInstance();
источник
new Class(...)
синтаксис.Я удивлен, что не вижу здесь следующего шаблона, который на самом деле выглядит очень простым.
использование
источник
Shout
Вы можете использовать для этого выражения классов (я считаю, что с версии 1.6).
или с именем, если вашему классу нужен внутренний доступ к своему типу
Другой вариант - использовать локальный класс внутри вашего синглтона, используя некоторые статические члены.
источник
Добавьте следующие 6 строк к любому классу, чтобы сделать его «Синглтоном».
Пример теста:
[Edit]: используйте ответ Alex, если вы предпочитаете получать экземпляр через свойство, а не через метод.
источник
new MySingleton()
скажу 5 раз? ваш код резервирует один экземпляр?я думаю, может быть, использовать дженерики быть жидким
как пользоваться
шаг 1
шаг 2
источник
Вы также можете использовать функцию Object.Freeze () . Это просто и легко:
источник
if (!this.instance)
внутри конструктора? Это дополнительная мера предосторожности на случай, если вы создали несколько экземпляров перед экспортом?Я нашел новую версию этого, с которой компилятор Typescript полностью согласен, и я думаю, что она лучше, потому что она не требует
getInstance()
постоянного вызова метода.Это имеет другой недостаток. Если у вас
Singleton
есть какие-либо свойства, то компилятор Typescript подберет подходящий, если вы не инициализируете их значением. Вот почему я включил_express
свойство в свой примерный класс, потому что, если вы не инициализируете его значением, даже если вы назначите его позже в конструкторе, Typescript будет думать, что оно не было определено. Это можно исправить, отключив строгий режим, но по возможности я предпочитаю этого не делать. Есть еще один недостаток этого метода, на который я должен указать, потому что конструктор фактически вызывается, каждый раз, когда он выполняет другой экземпляр, технически создается, но недоступен. Теоретически это могло вызвать утечку памяти.источник
Это, вероятно, самый долгий процесс создания синглтона в машинописном тексте, но в более крупных приложениях именно тот, который работал у меня лучше.
Сначала вам понадобится класс Singleton, скажем, "./utils/Singleton.ts" :
Теперь представьте, что вам нужен синглтон маршрутизатора "./navigation/Router.ts" :
Отлично !, теперь инициализируйте или импортируйте туда, где вам нужно:
При таком подходе синглтоны хорошо то, что вы по-прежнему используете всю красоту классов машинописного текста, это дает вам хороший intellisense, логика синглтонов каким-то образом отделена и ее легко удалить при необходимости.
источник
Мое решение для этого:
источник
return Modal._instance
. Таким образом, если вы используетеnew
этот класс, вы получите существующий объект, а не новый.В Typescript не обязательно следовать
new instance()
методологии Singleton. Импортированный статический класс без конструктора также может работать.Рассматривать:
Вы можете импортировать класс и ссылаться на него
YourSingleton.doThing()
в любом другом классе. Но помните, поскольку это статический класс, у него нет конструктора, поэтому я обычно используюintialise()
метод, который вызывается из класса, который импортирует синглтон:Не забывайте, что в статическом классе каждый метод и переменная также должны быть статическими, поэтому вместо
this
вас следует использовать полное имя классаYourSingleton
.источник
Вот еще один способ сделать это с помощью более традиционного подхода javascript с использованием IFFE :
Посмотреть демо
источник
Instance
переменной? Вы просто помещаете переменную и функции прямо подApp.Counter
.Другой вариант - использовать символы в вашем модуле. Таким образом вы можете защитить свой класс, даже если конечный пользователь вашего API использует обычный Javascript:
Использование:
Если пользователь использует ваш скомпилированный js-файл API, он также получит сообщение об ошибке, если попытается вручную создать экземпляр вашего класса:
источник
Не чистый синглтон (инициализация может быть не ленивая), а похожий паттерн с помощью
namespace
s.Доступ к объекту Синглтона:
источник
Это самый простой способ
источник
Таким образом, мы можем применить интерфейс, в отличие от принятого ответа Райана Кавано.
источник
После просмотра этого потока и экспериментов со всеми описанными выше параметрами я остановился на синглтоне, который можно создать с помощью подходящих конструкторов:
Это потребует первоначальной настройки (в
main.ts
илиindex.ts
), которую можно легко реализовать с помощьюnew Singleton(/* PARAMS */)
Затем в любом месте кода просто позвоните
Singleton.instnace
; в этом случае, чтобыwork
закончить, я бы позвонилSingleton.instance.work()
источник