多个嵌套依赖项的工厂模式?
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
会做的事情,绕过了冗长。
我了解简单形式的工厂模式,但如果 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
会做的事情,绕过了冗长。