在软件设计工厂模式中使用抽象的通用类



我有一些设计问题。我创建了一个费率计算器,如下所示:

Public Interface ICalculator
 Property PaymentTerm As Double
 Function Calculate() As CommissionValues
 ReadOnly Property CalculationRule As CalculationRuleEnum
End Interface
Public Interface IFlexibleRateCalculator
 Inherits ICalculator
  Property TransferRate As Decimal
End Interface
Public Interface IFixedRateCalculator
 Inherits ICalculator
  Property ContractRate As Decimal
End Interface
Public Interface IRateSettingBase
  Property RateType As RateTypeEnum
  ReadOnly Property Calculator As ICalculator
End Interface
Public MustInherit Class RateSetting
 Implements IRateSettingBase
  Public MustOverride ReadOnly Property Calculator() As ICalculator Implements IRateSettingBase.Calculator

我可以做这样的事情:

dim ratevalues as RateValues = RateSetting().Calculator.Calculate()

非常简单。问题在于,每种类型的计算器都有自己的一组属性,需要设置其计算方法才能正常工作。因此,我最终必须按以下方式实施

FlexibleRateCalculator
Implements IFlexibleRateCalculator
    Private mRequestedRate As Decimal
    Public Function Calculate() As RateValues Implements ICalculator.Calculate
    
FixedRateCalculator
 Implements IFixedRateCalculator
    Private mTransferRate As Decimal
    Public Function Calculate() As RateValues Implements ICalculator.Calculate

使用仿制药和抽象类创建一个工厂模式的最佳方法是什么,该模式将动态生成特定类型的计算器?

我需要一个非常通用的解决方案,因为将使用计算逻辑所需的自己的参数来添加许多计算率。我希望能够快速执行此操作,并可能通过DB控制这些速率计算。FYI在C#或vb.net中的答案:)预先感谢!

仅保留ICalculator接口,然后将更具体的接口转换为类。我想不出一个很好的理由,为什么您会创建一堂课只是为了存储一个变量,所以我将完全摆脱RateSetting

Public Interface ICalculator
    Property Rate As Double
    Property PaymentTerm As Double
    Function Calculate() As CommissionValues
    ReadOnly Property CalculationRule As CalculationRuleEnum
End Interface
Public Class FlexibleRateCalculator : Implements ICalculator
    Public Sub New(rate As Double)
        Me.Rate = rate
    End Sub
    '
    ' ICalculator implementation goes here
    '
End Class
Public Class FixedRateCalculator : Implements ICalculator
    Public Sub New(rate As Double)
        Me.Rate = rate
    End Sub
    '
    ' ICalculator implementation goes here
    '
End Class
Public Enum RateType
    Flexible = 1
    Fixed = 2
End Enum
Public Class CalculatorFactory
    Public Shared Function GetCalculator(rate As Double, type As RateType) As ICalculator
        Select Case type
            Case RateType.Flexible
                Return New FlexibleRateCalculator(rate)
            Case RateType.Fixed
                Return New FixedRateCalculator(rate)
            Case Else
                Throw New ArgumentException
        End Select
    End Function
End Class

您通过将速率和速率类型传递给GetCalculator方法来创建对象实例。我不知道您的意思是CalculationRule,但是如果对最终用户很重要,则应将其添加为附加参数。

您可以轻松添加更多的计算器类型,只要您不忘记在工厂方法中更新选择语句。

编辑:当然,您还可以在返回对象实例之前设置其他属性。但是,这种模式的目的是确保最终用户不需要了解如何实现Calculate()。如果您想为每个计算器制作更具体的工厂方法,它会破坏目的。

您是否熟悉任何IOC容器?您应该能够使用他们提供的工厂类型服务来生成适当的类型,并基于给定类型(枚举,字符串等)提供适当的参数/属性。

如果没有,您可能可以创建一个具有基于参数生成适当类型的方法的工厂类。此方法可以接受一个包含正确设置计算器所需属性然后通过ICLATER界面返回的属性的paramarray或其他对象。

最新更新