【问题标题】:How to configure the factory to generate the object?如何配置工厂生成对象?
【发布时间】:2012-07-02 00:29:23
【问题描述】:

也许标题不是很清楚。让我澄清一下我要完成的工作。

我必须基类:

  • 基础属性
  • 基础问题

BaseProperties 包含有关生成数学问题的数据。例如上图中,BasicAdditionProperties 包含 Addend1 和 Addend2,这两个对象知道生成值的范围来表示 BasicAdditionProblem。

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

我已阅读,建议将这些值作为基类传递。我的主要疑问是,当我将对象 BaseProperties 传递给工厂时,我是否必须一直转换对象?

或者我可以实施什么想法来模拟这种情况?还是我必须有一个静态工厂来维护并用作到具体工厂的映射? 提前致谢。

【问题讨论】:

    标签: c# design-patterns factory factory-pattern


    【解决方案1】:

    BaseProperties 类中定义一个抽象CreateProblem()。此方法可用于一般性地允许每个具体的 Properties 子类提供其自己的 Factory 方法。

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

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


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

    【讨论】:

      【解决方案2】:

      对此有多种解决方案。这仅取决于您要如何对其进行编程。

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

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

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

      【讨论】:

      • 我打算让数百个类继承自BaseProperties(继承自BaseProperties的具体数量=继承自BaseProblem的具体数量)
      • 那么,如果 BasicAdittionProperties 类具有相同类型的数据,您不妨像工厂中需要的 getter 一样制作抽象方法。为了制作问题,您必须始终创建一个特定的基类
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多