抽象工厂使用“新”吗?

时间:2012-02-02 18:52:15

标签: php design-patterns dependency-injection abstract-factory

我试图尽可能多地使用依赖注入,但是当涉及短期依赖等事情时我遇到了麻烦。

例如,假设我有一个博客管理器对象,希望生成它在数据库中找到的博客列表。这样做的选项(据我所知)是:

  1. 新博客();
  2. $这 - >装载机>博客();
    • loader对象创建各种其他类型的对象,如数据库对象,文本过滤器等。
  3. $这 - > blogEntryFactory->创建();
  4. 但是,#1很糟糕,因为它会产生强耦合。 #2仍然看起来很糟糕,因为它意味着必须事先注入对象工厂 - 暴露它可以创建的所有其他对象。

    3号似乎没问题,但是如果我使用#3,我是否将“new”关键字放在blogEntryFactory本身中,或者,我是否将加载器注入blogEntryFactory并使用加载器?

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

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

    注意

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

2 个答案:

答案 0 :(得分:4)

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

作为一个例子,假设PHP没有数组结构但有一个集合对象。您可以致电Blog或者您是否满意地说$this->collectionsFactory->create()

答案 1 :(得分:0)

回答标题:是的,抽象工厂通常使用new。例如,请参阅GoF手册第92页的MazeFactory代码。它包括return new Maze; return new Wall; return new Room; return new Door;

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