【问题标题】:Do Abstract Factories use "new"?抽象工厂是否使用“新”?
【发布时间】:2012-02-02 18:52:15
【问题描述】:

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

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

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

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

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

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

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

注意

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

【问题讨论】:

  • 如果我没有正确或透彻地解释这一点,请告诉我,我会尽力澄清
  • 我从未见过在模型类上使用依赖注入。除非Blog 类封装了一些业务逻辑(模型很少这样做),否则尝试减少与它的耦合是没有意义的——没有可耦合的行为。 (只有实体的结构,但这不会改变。)
  • 首先,感谢您的评论...那么您是说 BlogManager 应该/可以调用“new Blog()”吗?
  • 如果Blog 只是一个没有行为的“愚蠢”数据结构,并且您认为它永远不会有任何行为,那么是的。
  • 在什么情况下您需要一个模型实体的模拟实现没有行为?您也可以检查实际实现的属性。 (再一次,这是假设Blog 并没有真正封装任何东西,而是将一些数据聚集在一起。)

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


【解决方案1】:

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

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

【讨论】:

  • 用叶子解释开导。
  • Tandu,正如我在上面刚刚添加的,虽然这种情况可能不适合工厂,但有些情况下工厂值得。在这些情况下,您是在工厂中使用“新”,还是做其他事情?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多