8

我正在尝试尽可能多地使用依赖注入,但是在涉及短期依赖等问题时我遇到了麻烦。

例如,假设我有一个博客管理器对象,它想要生成它在数据库中找到的博客列表。执行此操作的选项(据我所知)是:

  1. 新博客();
  2. $this->loader->blog();
    • loader 对象创建各种其他类型的对象,如数据库对象、文本过滤器等。
  3. $this->blogEntryFactory->create();

但是,#1 不好,因为它会产生强耦合。#2 看起来仍然很糟糕,因为这意味着必须事先注入对象工厂——暴露它可以创建的所有其他对象。

数字 3 看起来不错,但如果我使用 #3,我是否将“新”关键字放入 blogEntryFactory 本身,或者,我是否将加载器注入 blogEntryFactory 并使用加载器?

如果我有许多不同的工厂,比如 blogEntryFactory(例如,我可以有 userFactory 和 commentFactory),那么在所有这些不同的工厂中放置“new”关键字似乎会产生依赖性问题。

我希望这是有道理的...

笔记

对于这个特定的博客示例,我已经得到了一些关于这如何不必要的答案,但事实上,在某些情况下你应该使用抽象工厂模式,这就是我要表达的观点。在这种情况下,您使用“新”,还是做其他事情?

4

2 回答 2

4

我不是专家,但我会对此有所了解。这假设它Blog只是一个数据模型对象,它充当某些数据的容器并由控制器填充(new Blog不是很有意义)。在这种情况下,Blog是对象图的叶子,使用new是可以的。如果您要测试需要创建 a 的方法,则必须Blog同时测试Blog无论如何的创建,并且使用模拟对象没有意义..Blog不会通过此方法持续存在。

例如,假设 PHP 没有数组结构,但有一个集合对象。你会打电话$this->collectionsFactory->create()还是会满意地说new Array;

于 2012-02-02T20:15:38.133 回答
0

回答标题:是的,抽象工厂通常使用new. 例如,参见MazeFactoryGoF 书第 92 页上的代码。这包括,return new Maze; return new Wall; return new Room; return new Door;

作为对注释的回答:使用抽象工厂创建数据模型的设计是非常值得怀疑的。目的是改变工厂产品的行为,同时让客户看不到它们的具体实现。没有行为的数据模型不会从抽象工厂中受益。

于 2018-11-02T18:21:25.507 回答