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
C# 如何配置工厂以生成对象?_C#_Design Patterns_Factory_Factory Pattern - Fatal编程技术网

C# 如何配置工厂以生成对象?

C# 如何配置工厂以生成对象?,c#,design-patterns,factory,factory-pattern,C#,Design Patterns,Factory,Factory Pattern,也许标题不太清楚。让我澄清一下我想要实现的目标 我必须学习基类: 基本属性 基本问题 BaseProperties包含有关生成数学问题的数据。例如,在上图中,BasicAdditionProperties包含Addend1和Addend2,这两个对象知道生成值的范围以表示BasicAddition问题 所以,这只是一个想法。。我想我应该把抽象类传递给工厂,这个应该会产生问题(在本例中是BasicAdditionProblem) 我已经读过了,建议将这些值作为基类传递。我主要的疑问是,当我把o

也许标题不太清楚。让我澄清一下我想要实现的目标

我必须学习基类:

  • 基本属性
  • 基本问题
BaseProperties包含有关生成数学问题的数据。例如,在上图中,BasicAdditionProperties包含Addend1和Addend2,这两个对象知道生成值的范围以表示BasicAddition问题

所以,这只是一个想法。。我想我应该把抽象类传递给工厂,这个应该会产生问题(在本例中是BasicAdditionProblem)

我已经读过了,建议将这些值作为基类传递。我主要的疑问是,当我把objectbaseproperties传递给工厂时,我是否一直都必须强制转换对象

或者我可以实现什么想法来模拟这个场景?或者我必须有一个静态工厂,在那里维护并用作映射到混凝土工厂? 提前谢谢


有多种解决方案。这取决于你想如何编程

抽象类中的抽象方法必须在从抽象类继承的所有类中处理。通过这种方式,您可以轻松地在工厂中调用抽象方法,而无需强制转换

然而,当您需要使用来自一个特定类的大量数据时,为其创建抽象方法是不明智的,您应该简单地强制转换对象


因此,这完全取决于有多少类继承自BaseProperties,以及这些类中有多少数据是相同的。

BaseProperties
类中定义一个抽象的
CreateProblem()
。此方法可以一般地用于允许每个混凝土属性子类提供自己的工厂方法

这类似于使用
WebRequest
子类的实例并对其调用
GetResponse()
,然后返回
WebResponse
的相应子类

这种分布式抽象工厂方法允许您轻松地将属性/问题对添加到系统中,因为映射这两个属性/问题对的代码仅包含在这两个类中



您还可以使用完整的抽象工厂实现,其中有定义
CreateProperties()
CreateProblem()
PropertyProblemFactory
。因此,在您的示例中,您将拥有知道如何创建匹配集的
AdditionFactory
。但这迫使您为每个属性/问题对定义一个额外的类。当您有一个类使用当前/选定的
属性问题工厂
,用它创建一个
属性
,然后立即使用相同的
属性问题工厂
来创建匹配的
问题
时,它的效果最好。一旦您放弃了对工厂的引用,只引用了
属性
,就很难重新定位正确的工厂以产生
问题
。(这可以通过另一个类来解决,以将对象类型映射到工厂,但复杂性会增加。因此,我建议的第一种方法在这种情况下更好)。

我计划让数百个类从BaseProperties继承(从BaseProperties继承的混凝土数量=从BaseProperties继承的混凝土数量问题)那么,如果basicaditionproperties类具有相同类型的数据,那么您也可以创建抽象方法,比如工厂中需要的getter。为了解决问题,您必须始终创建一个特定的基类