我以一种简单的形式理解工厂模式,但是如果该类需要多个嵌套的依赖项,则了解不多。例如,
$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
的实例及其所有依赖项?
答案 0 :(得分:1)
您必须走另一条路。客户端代码在工厂对象上调用.build
时,一切都应该准备就绪,因此.build
很少使用任何参数,并且如果这样做了,它们通常用作辅助功能:日志记录,某种调试-时间帮手,无论如何。但这并不意味着您必须使.build
参数保持不变。
所以问题是如何到达无参数的.build
,对吗?好吧,如果您认为更合理,则可以使用AbstractFactory
模式-工厂的工厂,也可以选择“高级工厂”。这可能需要实施。通常,对于大型且相当复杂的项目,将需要某种ServiceLocator
-基本上是一个DI容器。它可能是全局的,并且“知道”所有现有服务(尽管我不推荐这样做),或者可能更精确(取决于模块情况,如模块范围或命名空间范围)。其他选择是普通的老套-函数式编程中的一个概念,可以相对容易地(当然,一旦获得)就可以将其应用到代码中;从本质上讲,它绕过了冗长而完成AbstractFactory
的工作。