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

Factory pattern for multiple nested dependencies?

我了解简单形式的工厂模式,但如果 class 需要多个嵌套依赖项,我就不了解了。例如,

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

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

在上面的例子中,你如何正确地为 class Foo 创建一个工厂模式,这样当你 运行 $factory->build(); 你得到一个 Foo 及其所有依赖项?

你必须反过来。当客户端代码在工厂对象上调用 .build 时,一切都应该准备就绪,因此 .build 很少接受任何参数,如果接受,通常它们充当辅助工具:日志记录、某种调试-时间帮手,无论如何。不过,这并不意味着您必须保持 .build 无参数。

所以问题是如何获得无参数 .build,对吗?好吧,要么 AbstractFactory 模式——一个工厂的工厂,要么 "a higher order factory",如果它对你更有意义的话。它可能需要实施。通常,对于大型且相当复杂的项目,它需要某种 ServiceLocator - 基本上是一个 DI 容器。它可能是全局的和 "know" 所有现有服务(尽管我不推荐它),或者它可能更精确(例如模块范围或名称空间范围 - 视情况而定)。其他选项是普通的老柯里化——一个来自函数式编程的概念,它可以相对容易地被应用到你的代码中(当然,一旦你得到它);本质上,它做了 AbstractFactory 会做的事情,绕过了冗长。