多个嵌套依赖项的工厂模式?

时间:2019-01-29 17:27:07

标签: php design-patterns factory factory-pattern

我以一种简单的形式理解工厂模式,但是如果该类需要多个嵌套的依赖项,则了解不多。例如,

$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 :(得分:1)

您必须走另一条路。客户端代码在工厂对象上调用.build时,一切都应该准备就绪,因此.build很少使用任何参数,并且如果这样做了,它们通常用作辅助功能:日志记录,某种调试-时间帮手,无论如何。但这并不意味着您必须使.build参数保持不变。

所以问题是如何到达无参数的.build,对吗?好吧,如果您认为更合理,则可以使用AbstractFactory模式-工厂的工厂,也可以选择“高级工厂”。这可能需要实施。通常,对于大型且相当复杂的项目,将需要某种ServiceLocator-基本上是一个DI容器。它可能是全局的,并且“知道”所有现有服务(尽管我不推荐这样做),或者可能更精确(取决于模块情况,如模块范围或命名空间范围)。其他选择是普通的老套-函数式编程中的一个概念,可以相对容易地(当然,一旦获得)就可以将其应用到代码中;从本质上讲,它绕过了冗长而完成AbstractFactory的工作。