【问题标题】:Factory object creating objects that need other objects工厂对象创建需要其他对象的对象
【发布时间】:2015-03-12 09:24:22
【问题描述】:

我需要一个能够创建多个对象但在其中注入其他对象的工厂对象。 例如:

class MyFactory
{
  public function createObjectA() {
    return new ObjectA(new ObjectANeededObject1(), new ObjectANeededObject1());
  }

  public function createObjectB() {
    return new ObjectB(new ObjectBNeededObject1(), new ObjectBNeededObject1());
  }
}

我的工厂是否也应该实例化所需的对象(考虑到我的工厂可以创建任何对象)? 我是否应该通过注入将它们传递到我的工厂构造函数中(但构造函数将包含许多许多参数)? 我是否应该将它们作为参数传递给我的工厂方法(但是工厂客户端将知道应该如何创建要创建的对象,并且知道它不是它的责任)? 我的工厂应该创建对象构建器(能够创建我的对象及其所需的对象)而不是直接创建我的对象吗?

你有什么建议?

谢谢,

【问题讨论】:

  • 现在是你开始阅读有关Dependency Injection Containers (DIC) 的时间了
  • 谢谢马克。如果我理解得很好,容器将帮助我们创建不同的对象 ObjectXNeddedObjectY。但是,如果我没记错的话,那是同样的问题,我读到我不应该将我的容器提供给所有对象,而只是传递由容器创建的对象。那么我应该将我的所有对象 ObjectXNeddedObjectY(由我的容器创建)传递给我的工厂吗?
  • DIC 应该返回特定于要实例化的类的对象集合,然后工厂可以使用反射来实例化该集合,使用像 http://www.php.net/manual/en/reflectionclass.newinstanceargs.php 这样的调用
  • 不太明白你想用反射做什么,但你认为我的工厂应该包含 DI 容器吗?
  • 看看像PHP-DI,或Aura.Di,或DiceOrno\Di这样的DI容器实际上是如何工作的......他们真的可以为你简化事情

标签: php design-patterns dependency-injection factory-pattern solid-principles


【解决方案1】:

你的 Factory 类不应该知道如何从 ObjectBNeededObject1 类中实例化一个对象,因为如果构造函数发生变化,你还必须返回到 Factory 类并做必要的工作以避免回归

更新

class MyFactory
{
  public static function createObjectA($object1, $object2) {
    return new ObjectA($object1, $object2);
  }

  public static function createObjectB($object1, $object2) {
    return new ObjectB($object1, $object2);
  }
}

$objectA = MyFactory->createObjectA(new ObjectANeededObject1(), new ObjectANeededObject1());
$objectB = MyFactory->createObjectB(new ObjectANeededObject1(), new ObjectANeededObject1());

【讨论】:

  • 谢谢哈拉耶姆。但我不喜欢工厂的客户必须知道工厂需要哪些对象才能创建所需的对象。例如,如果客户端是需要使用多种“工作流程步骤”的类 Workflow,如果其中一个步骤需要例如 HttpRequest 对象,那么我的工作流程对象将包含能够创建步骤的工厂和HttpRequest。
  • 你的建议毫无意义,违背了工厂的目的......“因为如果构造函数发生变化,你也必须回到......”如果你考虑一下,这实际上是反对让客户端直接实例化具体类的论点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多