Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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
C# 每个类都应该有一个工厂类吗?_C#_Oop_Design Patterns_Dependency Injection - Fatal编程技术网

C# 每个类都应该有一个工厂类吗?

C# 每个类都应该有一个工厂类吗?,c#,oop,design-patterns,dependency-injection,C#,Oop,Design Patterns,Dependency Injection,我的理解是,工厂类的主要目的是防止类之间硬编码引用。因此,我可以调用_processorFactory.GetInstanceoptions,而不是编写新的Processoroptions,它可以作为依赖项注入 现在,当我创建类时,我发现我创建了类、工厂类、接口和工厂接口,这似乎有点过分。我甚至有多个工厂的实现,发现自己想要创建一个工厂。我做错了什么?什么时候类应该有工厂?创建对象实例不需要工厂。您可以使用Activator 因此,如果您需要创建对象来完成更多的工作,而不仅仅是使其成为现实,那么

我的理解是,工厂类的主要目的是防止类之间硬编码引用。因此,我可以调用_processorFactory.GetInstanceoptions,而不是编写新的Processoroptions,它可以作为依赖项注入


现在,当我创建类时,我发现我创建了类、工厂类、接口和工厂接口,这似乎有点过分。我甚至有多个工厂的实现,发现自己想要创建一个工厂。我做错了什么?什么时候类应该有工厂?

创建对象实例不需要工厂。您可以使用Activator


因此,如果您需要创建对象来完成更多的工作,而不仅仅是使其成为现实,那么您实际上只需要一个工厂类

我建议使用常识方法。如果为每个类编写一个工厂似乎有些过分,那么很可能是这样。为了测试能力和可维护性,您应该依赖接口而不是具体的类

如果需要执行某些逻辑以获取要传递给类的构造函数的值,请使用工厂。否则,您可以使用控制反转容器(如MEF或Unity)创建类的实例


工厂主要用于封装

您是一名库/框架开发人员,希望公开API,但不想发布对象的初始化方式。因此,您需要设计一个公共接口和一个内部实现。工厂将创建这些实现的实例,并以适当的方式对它们进行初始化,消费者将能够通过公共接口使用它们

您希望系统中的某些对象不应与实现耦合,因为某些实现细节可能会根据某些条件或部署环境而有所不同。因此,依赖项作为接口或抽象类提供,以避免在具体实现上创建依赖项

可能还有很多其他的场景工厂模式工作得很好,但这不是关于编写工厂模式用例的百科全书


因此,您不会为世界上的每一种类型创建工厂。

工厂类的主要目的是防止类对彼此的引用进行硬编码。[需要引用]@Will这是我自己的观点,基于我对工厂使用的看法。@KyleMcClellan,你对工厂模式的理解过于简单。工厂模式使用继承不仅抽象对象的创建,而且抽象对象的类型。消费类需要知道的只是它所依赖的对象的通用接口。顺便说一句,最好的做法是不要强迫类依赖于它不需要的东西-因此建议通过工厂创建的对象接口注入实际的依赖关系,而不要注入工厂本身。@DavidCulp感谢这使我走上了正确的道路。当对象具有不同的生命周期时,通常需要工厂,因为BL用于配置它们。如果类的使用者具有较长的生命周期,则应调用工厂。否则可以注入实例。您不需要Activator.CreateInstance来创建对象的实例,通常也不应该使用它来创建对象的实例。您通常应该使用对象的构造函数。您是否建议我将类型本身注入类而不是工厂?否则类型仍然是硬编码的,@Servy是正确的,我也可以使用构造函数。实际上不需要使用Activator.CreateInstance,只需要在运行时实例化编译时未知的复杂对象。这与问题或工厂无关。@KyleMcClellan有时您需要它,当您的代码值得使用并且需要它们提供的工具时,一定要使用更广义的抽象。当你不需要它们时,不要使用它们。但这与这个答案无关。