Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我的域对象在需要时可以使用工厂方法或工厂层吗?_Php_Design Patterns_Factory - Fatal编程技术网

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

Php 我的域对象在需要时可以使用工厂方法或工厂层吗?,php,design-patterns,factory,Php,Design Patterns,Factory,我的域对象在需要时可以使用工厂方法或工厂层吗 我一直在尝试让客户机代码创建和注入依赖项,不管它们在哪里,但这似乎并不总是正确的做法。例如,在这个问题中,用户可以拥有许多宠物;没有用户,宠物就无法生存 我一直在尝试创建一个宠物,然后将其添加到用户的集合中,但问题是为了创建宠物,我需要向用户提供(这与使用User::addPet(ConcretePet)方法的目的背道而驰) 我宁愿使用一个User::addPet()方法来接受参数数组,然后使用工厂或工厂方法创建Pet。这合理吗 编辑:另一个场景 这

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

我一直在尝试让客户机代码创建和注入依赖项,不管它们在哪里,但这似乎并不总是正确的做法。例如,在这个问题中,用户可以拥有许多宠物;没有用户,宠物就无法生存

我一直在尝试创建一个宠物,然后将其添加到用户的集合中,但问题是为了创建宠物,我需要向用户提供(这与使用
User::addPet(ConcretePet)
方法的目的背道而驰)

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

编辑:另一个场景


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

如果宠物没有它的用户就不能生存,这并不意味着用户没有宠物就可以生存

问题是宠物是否需要它的使用者,反之亦然。我几乎可以单独考虑这两个问题,根据问题的不同,交叉引用它们可能是个好主意,也可能不是。一般来说,我认为这不是很好,因为这意味着用户可以与宠物互动,宠物可以与用户互动,这两种互动都可以触发反向互动,导致无休止的循环

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

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

我宁愿使用一个User::addPet()方法来接受 参数数组,然后使用工厂或 工厂法。这合理吗


事实并非如此。此函数内部的信息不比外部的信息多。所有pet参数都存在,并且您拥有用户对象。您还需要什么来创建与用户有关系的宠物,然后将该宠物添加到用户?

您好,我可以创建一个没有宠物的用户,没问题。当我创建宠物时,我可以给用户注射,没有问题。事实上,我有一个服务层可以做到这一切,没有问题。但这让我的领域模型非常贫乏。我可以在用户对象上放置一个addPet(ConcretePet)方法,但是它会做什么呢?宠物已经连接到用户,没有什么可以做的了。如果没有什么可以做的了,那么您希望做更多什么?除非有原因,否则你不应该做得太多。但是我可能还是误解了你的问题。嗨,斯文,如果我让服务层在向用户添加宠物后处理问题,我的域模型就会开始显得贫乏。如果域模型应该反映现实世界,我想我需要一个用户的addPet方法。(否则,我的域逻辑将跨越两层)。您描述的结构可能是贫乏的。你有一个用户。还有一只宠物,它是用户通过构造器注入的。然后你用一个函数将宠物添加到用户。这完全说明,可以有一个没有宠物的单一用户,但没有一个没有用户的宠物。而且双方都在内部相互了解。如果你认为这是贫乏的,那么你没有足够的描述你以后想对这些对象做什么。添加许可证基本上是一样的。许可证对象是否可以在没有用户的情况下存在?没有宠物?用户是否应该能够创建自己的许可证,或者这真的应该是一个根据请求发布这些许可证的机构的功能。是的,您可以在用户中包含一个许可工厂,该工厂为任何连接到用户的宠物创建许可对象,但这不是“现实”的工作方式。宠物或者有自己的许可证,或者用户有许可证,但是许可证必须来自不同层上的其他地方。