Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Design patterns 我应该选择依赖注入还是工厂模式_Design Patterns_Dependency Injection - Fatal编程技术网

Design patterns 我应该选择依赖注入还是工厂模式

Design patterns 我应该选择依赖注入还是工厂模式,design-patterns,dependency-injection,Design Patterns,Dependency Injection,我正在调查依赖注入。我发现:引用的大多数使用依赖注入的示例,我们也可以使用工厂模式来解决 你能帮我比较一下DI和工厂模式的优缺点吗?我应该总是选择依赖注入而不是工厂模式吗?还是取决于指定的项目 我怎么知道最好的解决方案是什么?这方面的最佳做法是什么?让我们看看它们之间的区别 使用DI,对象在外部创建并“注入”以供客户机对象使用。 注入通常通过构造函数完成 但是,在复杂的情况下,通常会注入DI容器来创建依赖项对象,包括所有子依赖项。所以它看起来像抽象工厂 使用抽象工厂,注入具体工厂类的实例,并由客

我正在调查依赖注入。我发现:引用的大多数使用依赖注入的示例,我们也可以使用工厂模式来解决

你能帮我比较一下DI和工厂模式的优缺点吗?我应该总是选择依赖注入而不是工厂模式吗?还是取决于指定的项目


我怎么知道最好的解决方案是什么?这方面的最佳做法是什么?

让我们看看它们之间的区别

使用DI,对象在外部创建并“注入”以供客户机对象使用。 注入通常通过构造函数完成

但是,在复杂的情况下,通常会注入DI容器来创建依赖项对象,包括所有子依赖项。所以它看起来像抽象工厂

使用抽象工厂,注入具体工厂类的实例,并由客户机对象实例化依赖项对象

所以,DI和抽象工厂几乎是相同的,当您认为在这两种情况下,工厂对象都被传递给客户机,使其能够创建其依赖关系。 仅在简单情况下,依赖对象在外部创建并传递给客户机对象。这就是战略模式的工作原理

由于DI容器现在非常流行,并且在框架中被广泛使用,它们已经有效地取代了抽象工厂,至少作为一种经常被提及的模式。DI容器是比抽象工厂所设想的要复杂得多的实体(我相信)


因此,没有最佳实践

@pcperth:来自Xamarin大学,他们提到两者都有优点和缺点:

此外,我认为使用DI时,类首先被创建,我们的程序在运行时保留它,这样会浪费内存(以防我们需要优化内存)

这是我的观点,但实际上我不知道什么更好,或者在特定情况下我们应该使用什么。那我需要在那里讨论一下


加油

我喜欢在接口上使用简单的依赖项注入。 只需将实现接口的对象传递给构造函数

这还有一个额外的优点,即您可以轻松地模拟接口并在构建服务器/计算机上运行测试。由于Xamarin的部署需要很长时间,因此请尽量使用单元测试。

您应该同时使用这两种测试

Factory的任务是根据给定的参数找到接口的正确实现,并返回接口的实例。这是解决一个问题的一种方法,即类不能同时负责自身的实例化和其他操作,因为它违反了SRP

DI通常通过向实际类的构造函数传递参数来注入依赖项。之所以需要它,是因为高级代码不应该知道它使用的是低级代码的哪个实现,而应该知道这个实现使用某个接口来响应。否则我们将违反DIP


因此,工厂与DI非常兼容。实际上,DI容器只是一个自动化工厂,它从注释、配置文件等中提取信息,以便能够生成应用程序实例并注入其依赖项。当然,它的依赖项也有依赖项等等,所以如果您手动编写它,它将是一个很长的代码,所以它很有可能是一个god对象。您可以通过定义工厂来解决这一问题,这将使工厂变得更短,但不知何故,人们更喜欢自动化。

您能否给出这两种模式的示例。这将有助于理解您打算如何使用它们。在本文中,“依赖性”是什么意思?在本文中“依赖性”是什么意思?@snr-Well依赖性是一个广泛的概念。通常它只是意味着代码的一部分依赖于代码的另一部分。在某些语言中,您可以将依赖项作为参数传递给依赖代码,例如使用函数名、lambda函数、对象等。当我们有许多使用公共接口的替代实现时,我们会这样做,例如,按函数列出的公共参数或按对象列出的公共接口,我们希望在它们之间进行选择。依赖项注入是指我们将其作为构造函数或setter参数传递。对于DI容器,我们根据配置选择依赖关系。