Заводской шаблон для нескольких вложенных зависимостей? - PullRequest
0 голосов
/ 29 января 2019

Я понимаю шаблон фабрики в простой форме, но не очень, если класс требует нескольких вложенных зависимостей.Например,

$cfg = new Cfg();
$cfg->setA('a');
$cfg->setB('b');

$qux = new Qux('x');    
$bar = new Bar($cfg, $qux);    
$foo = new Foo($cfg, $bar);

В приведенном выше примере, как правильно сделать фабричный шаблон для класса Foo, чтобы при запуске $factory->build(); вы получали экземпляр Foo со всемиего зависимости?

1 Ответ

0 голосов
/ 30 января 2019

Вы должны пойти другим путем.К тому времени, когда клиентский код вызывает .build на заводском объекте, все должно быть готово, поэтому .build редко принимает какие-либо параметры, и, если это так, обычно они служат вспомогательными: журналирование, какие-то помощники времени отладки, что угодно,Это не значит, что вы должны оставить свой .build без параметров.

Так что вопрос в том, как добраться до без параметров .build, верно?Ну, или AbstractFactory шаблон - фабрика фабрик, или «фабрика более высокого порядка», если это имеет больше смысла для вас.Это может занять реализации.Обычно для больших и довольно сложных проектов требуется какой-то ServiceLocator - в основном, DI-контейнер.Он может быть глобальным и «знать» все существующие службы (хотя я не буду рекомендовать его), или он может быть более точным (например, для всего модуля или для пространства имен - в зависимости от обстоятельств).Другие варианты - это просто старая карри - концепция от функционального программирования, которая может быть относительно легко адаптирована (конечно, как только вы ее получите) к вашему коду;по сути, он делает то, что AbstractFactory делает, минуя многословие.

...