Задать вопрос
@eugenedrvnk

Синглтон или обычный объект?

Сейчас читаю про разные паттерны и немного не понял момент про синглтон.
По определнию - это класс, который в рамках приложения может быть лишь в одном экземпляре.
А что в такой ситуации мешает просто создать объект, который будет обладать аналогичным функционалом и всё? (вместо создания класса и экземпляра этого класса)
Какие здесь преимущества именно в создании класса?
  • Вопрос задан
  • 167 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@GrayHorse
А что в такой ситуации мешает просто создать объект

Потому что в Java, C# нельзя написать такое:

export const singleton = {name: "foo"}; // Полноценный синглтон для JS


Импортируются и экспортируются лишь классы. Создать глобальную переменную, которая будет хранить глобальное состояние, которую потом можно импортировать в разных файлах (классах) — нельзя.

Следовательно, нужен класс, у которого будет статическое поле, содержащие это глобальное состояние.

Т.к. экземпляр класса должен быть только один, кем он должен быть создан? А создается он "автоматически" — непосредственно при загрузке класса в статическом блоке инициализации класса (да, в JS это тоже есть), и в качестве дополнительной меры предосторожности, чтобы никто не создал второй экземпляр, конструктор делается приватным — недоступным для любого кода, который будет работать с этим классом.

Какие здесь преимущества именно в создании класса?

Функционально — никакие.
Код будет выглядеть привычнее для людей знакомых с Java и C#.

Ради формальности, все-таки да, отличие есть, и оно в том, что в случает использования класса, тот объект будет экземпляром класса синглтон, и еще один экземпляр этого класса создать не получится. Можно даже проверку сделать с помощью instanceof, чтобы удостовериться, что передается именно инстанс того класса, который может быть лишь в одном экземпляре, а не какой-то другой объект. А если это "просто объект" — ты сможешь подсунуть полную "копию" без каких-либо проблем, создав ее с помощью литеральной записи.
Ответ написан
Комментировать
briahas
@briahas
ObjC, Swift, Python
ИМХО, почему синглтон, а не обычный объект - чтобы объект был одним и тем же в разных частях вашей программы - надо его туда передать.
Синглтон же - достаточно просто создать экземпляр этого класса и автоматически подтянется ранее созданный, в другом конце приложения, экземпляр. Что и даст нам "по определению единственный экземпяр" как написано предыдущими ораторами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы