use*_*228 5 vb.net generics abstract-class factory-pattern
嘿家伙我有一点设计问题.我创建了一个率计算器,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
dim ratevalues as RateValues = RateSetting().Calculator.Calculate()
Run Code Online (Sandbox Code Playgroud)
很简单.问题是每种类型的计算器都有自己的属性集,需要设置它们才能使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
Run Code Online (Sandbox Code Playgroud)
使用泛型和抽象类创建工厂模式以动态生成特定类型的计算器的最佳方法是什么?
我需要一个非常通用的解决方案,因为许多计算速率将被添加和修改所有计算逻辑所需的参数.我希望能够快速完成此操作并可能通过db控制这些速率计算.欢迎在C#或VB.Net的FYI答案:)提前感谢!
仅保留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
Run Code Online (Sandbox Code Playgroud)
您可以通过将速率和速率类型传递给该GetCalculator方法来创建对象实例。我不知道你的意思CalculationRule,但如果它对最终用户很重要,那么你应该将其添加为附加参数。
只要您不忘记更新工厂方法中的 select 语句,您就可以轻松添加更多实现 ICalculator 的计算器类型。
编辑:当然,您还可以在返回对象实例之前设置其他属性。然而,这种模式的要点是确保最终用户不需要知道如何Calculate()实现。如果您想为每个计算器创建更具体的工厂方法,那么它就达不到目的了。
| 归档时间: |
|
| 查看次数: |
802 次 |
| 最近记录: |