我的域对象在需要时可以使用工厂方法或工厂层吗?

时间:2013-07-12 07:12:35

标签: php design-patterns factory

我的域对象在需要时可以使用工厂方法或工厂层吗?

我一直试图让客户端代码创建并注入依赖项,无论它们存在于哪里,但似乎这并不总是正确的事情。在这个问题中,例如Where to check for mandatory properties in a domain object?,用户可以拥有许多宠物;如果没有用户,宠物就不能存在。

我一直在尝试创建一个Pet,然后将其添加到User的集合中,但问题是为了创建Pet我需要提供User(这违背了User::addPet(ConcretePet)的目的法)。

我宁愿做的是使用User::addPet()方法接受一系列参数,然后使用工厂或工厂方法创建Pet。这合理吗?

编辑:另一个场景

这是我希望我的域模型访问工厂的另一种情况。如果我的用户需要他们拥有的每个宠物的许可证对象,那么在User :: addPet(ConcretePet)方法中创建它是否有意义?当然,我可以在服务层创建许可证,但这又意味着将业务逻辑从域中移除!

1 个答案:

答案 0 :(得分:0)

如果宠物没有它的用​​户就不能存在,这并不意味着用户可以在没有宠物的情况下存在。

问题是宠物是否需要它的用户,反之亦然。我几乎可以考虑单独存在,并且交叉引用它们可能是一个好主意,也可能不是,这取决于问题。一般来说,我说它不太好,因为这意味着用户可以与宠物互动,宠物可以与用户互动,并且两种互动都可以触发反向互动,从而导致无尽的循环。

更安全的解决方案是拥有一个包含用户和宠物的对象,并指导它们之间的所有交互:用户 - 宠物关系。

如果您声明无法注入对象依赖项,那么您做错了什么。如果你想要注入一个工厂,你将使用服务定位器反模式,这是另一个应该避免的代码气味。

  

我宁愿做的是拥有一个接受的User :: addPet()方法   参数数组,然后使用工厂或a创建Pet   工厂方法。这合理吗?

不是。此功能内部没有任何更多信息,而不是外部信息。所有宠物参数都存在,并且您拥有用户对象。您还需要创建一个与用户有关系的宠物,然后将该宠物添加给用户?