@topuserman

Альтернатива Singleton?

То, что Singleton - антипаттерн, всем известно, и все смогут рассказать про его отрицательные стороны.

Хочу понять, какие же бывают альтернативы для различных задач, в которых часто применяют Singleton.

Например, задача с классом конфига (или реализация классов Request - которая содержит все данные GET/POST и т.д.): часто встречаю что ее реализуют через Singleton, чтобы каждому объекту не приходилось читать и парсить файл конфигурации (или данные из БД).

Эффективно ли такие задачи решать через кеширование данных ?

Также бывает такой тип задач (где выручает Singleton) - это задачи с подключением к какому-то источнику данных (например подключение к БД).

Я не знаю как такое обеспечить без Singleton. Подключение тут никак не закешируешь.
Единственный вариант, который мне известен, это через внедрение зависимостей.
Но я не представляю в какой части приложения это делают. Нужно создать подключение к БД в front-controller и поместить в DI-контейнер, и в дальнейшем использовать ? Или как ?

Какие есть еще варианты, типы задач и их решений ?
  • Вопрос задан
  • 1117 просмотров
Пригласить эксперта
Ответы на вопрос 3
ivanvorobei
@ivanvorobei
iOS разработчик, канал https://t.me/sparrowcode
То, что Singleton - антипаттерн, всем известно

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

Все смогут рассказать про его отрицательные стороны.

Как и про любой другой паттер / инструмент.
Ответ написан
serginhold
@serginhold
Единственный вариант, который мне известен, это через внедрение зависимостей.
Но я не представляю в какой части приложения это делают. Нужно создать подключение к БД в front-controller и поместить в DI-контейнер, и в дальнейшем использовать ? Или как ?

почитай что-нибудь нормальное про di.

контейнер создается при старте приложения,
в нем создаешь экземпляр подключения к бд:
$container->set('db', function () use ($container) {
    return new DbConnection($container->get('config')['db']);
});

потом подключение передаешь в те сервисы, где оно нужно:
$container->set('MyService', function () use ($container) {
    return new MyService($container->get('db'));
});


как пример где это происходит: www.slimframework.com/docs/v4/concepts/di.html
Ответ написан
solotony
@solotony
покоряю пик Балмера
static ?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы