2012-11-07 44 views
5

嘿,我有一些設計問題。我創建了一個率計算器如下:在軟件設計工廠模式中使用抽象泛型類

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() 

很簡單。問題是每種類型的計算器都有自己的一組屬性,需要設置它們以使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 

什麼是使用泛型和抽象類來創建一個工廠模式,將動態生成特定類型的計算器的最佳途徑?

我需要一個非常通用的解決方案,因爲許多計算速率將被添加和修改,並且都使用它們自己的計算邏輯所需的參數。我希望能夠快速做到這一點,並可能通過數據庫控制這些費率計算。 FYI答案在C#或VB.Net歡迎:) 在此先感謝!

+0

這是vb.net嗎?請添加語言標記以獲得更多關注。 –

+0

謝謝。是的,它現在在VB.Net,但我可能會轉換到C#,所以任何語法都會有所幫助。我更關心這個設計。再次感謝。 – user1794228

回答

0

只保留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,但是如果它對最終用戶很重要,那麼你應該添加它作爲一個額外的參數。

只要您不忘記更新工廠方法中的select語句,您可以輕鬆地添加更多實現ICalculator的計算器類型。

編輯:當然,您也可以在返回對象實例之前設置其他屬性。然而,這種模式的要點是要確保最終用戶不需要知道如何實現Calculate()。如果你想爲每個計算器製作更具體的工廠方法,這種方法就會失敗。

0

您是否熟悉任何IoC容器?您應該能夠使用它們提供的工廠類型的服務,根據給定的類型(枚舉,字符串等)生成具有適當參數/屬性的適當類型

如果不是,您可以創建一個工廠類它有一個基於參數生成適當類型的方法。該方法可以接受ParamArray或其他對象,該對象包含正確設置計算器所需的屬性,然後通過ICalculator接口將其返回。