У меня есть вопрос о правильном способе реализации фабричного шаблона в PHP, который используется для создания экземпляров сложных объектов с их зависимостями. Давайте предположим, что у фабричного класса есть метод ‘build’, так что, например, класс User создается следующим образом:
$factory->build('User');
Класс User должен извлекать пользовательские данные из хранилища (базы данных), поэтому он зависит от объекта Repository — конструктор выглядит так:
public function __construct(Repository $repository);
Это означает, что метод ‘build’ фабрики должен вызывать что-то вроде этого
$user = new User(new Repository());
Теперь давайте предположим, что мне также нужно создать экземпляр объекта HomeController, который отображает содержимое на домашней странице. Он извлекает список последних статей — чтобы отобразить их на домашней странице, поэтому ему также необходим объект репозитория. Так что метод сборки будет вызывать что-то вроде этого:
$home = new HomeController(new Repository());
Итак, теперь ясно, что у нас есть два экземпляра объекта Repository, хотя на самом деле одного экземпляра в этом случае вполне достаточно. Поэтому мне было интересно, будет ли хорошей практикой для фабричного шаблона действительно регистрировать экземплярный объект Repository (сохраняющий его в массиве $ selectedObjects объекта Factory) и возвращать его из таблицы, если он был создан ранее. Таким образом, создание объекта в методе сборки будет выглядеть так:
$user = new User($this->build('Repository')); // Here Repository is created first time.
$home = new HomeController($this->build('Repository')); //Here it is retrieved from list of already registered objects
В этом случае объект репозитория фактически действует как синглтон. Мне интересно, является ли этот подход правильным или лучше создать два независимых объекта репозитория.
Задача ещё не решена.
Других решений пока нет …