2012-11-07 14 views
5

अरे दोस्तों मेरे पास एक डिज़ाइन समस्या है।सॉफ्टवेयर डिजाइन फैक्टरी पैटर्न में अमूर्त जेनेरिक कक्षाओं का उपयोग

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

सुंदर सरल:

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 

मैं कुछ इस तरह कर सकते हैं: मैं एक दर कैलकुलेटर के रूप में निम्नानुसार बनाया। समस्या यह है कि प्रत्येक प्रकार के कैलक्यूलेटर के पास अपने गुणों का सेट होता है जिसे उनकी गणना() विधियों को ठीक से काम करने के क्रम में सेट करने की आवश्यकता होती है। इसलिए मैं इस प्रकार

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 

जेनरिक और अमूर्त वर्गों का उपयोग करना एक कारखाने पैटर्न है कि एक विशिष्ट प्रकार गतिशील रूप से एक कैलकुलेटर उत्पन्न होगा बनाने के लिए सबसे अच्छा तरीका क्या है लागू करने के लिए होने अंत ??

मुझे एक बहुत ही सामान्य समाधान की आवश्यकता है क्योंकि कई गणना दरों को जोड़ा जाएगा और गणना तर्क के लिए आवश्यक अपने स्वयं के पैरामीटर के साथ संशोधित किया जाएगा। मैं इसे जल्दी से करने और संभवतः डीबी के माध्यम से इन दर गणना को नियंत्रित करने में सक्षम होना चाहता हूं। सी # या वीबी.Net में एफवाईआई का जवाब स्वागत है :) अग्रिम धन्यवाद!

+0

क्या यह vb.net है? अधिक ध्यान पाने के लिए कृपया एक भाषा टैग जोड़ें। –

+0

धन्यवाद। और हाँ यह अभी VB.Net में है लेकिन मैं सी # में परिवर्तित हो सकता हूं इसलिए सिंटैक्स मदद करेगा। मैं डिजाइन से ज्यादा चिंतित हूं। एक बार फिर धन्यवाद। – 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 द्वारा आपका क्या मतलब है, लेकिन यदि अंतिम उपयोगकर्ता के लिए यह महत्वपूर्ण है तो आपको इसे अतिरिक्त पैरामीटर के रूप में जोड़ना चाहिए।

आप आसानी से अधिक कैलकुलेटर प्रकार जोड़ सकते हैं जो आईसील्यूलेटर को लागू करते हैं, जब तक कि आप फैक्ट्री विधि में चयन कथन को अपडेट करना न भूलें।

संपादित करें: निश्चित रूप से आप ऑब्जेक्ट इंस्टेंस लौटने से पहले अतिरिक्त गुण भी सेट कर सकते हैं। हालांकि इस पैटर्न का बिंदु यह सुनिश्चित करना है कि अंतिम उपयोगकर्ता को यह जानने की आवश्यकता नहीं है कि Calculate() कैसे कार्यान्वित किया गया है। यदि आप प्रत्येक कैलकुलेटर के लिए अधिक विशिष्ट फैक्ट्री विधियां बनाना चाहते हैं, तो यह इस उद्देश्य को हरा देता है।

0

क्या आप किसी भी आईओसी कंटेनर से परिचित हैं? आपको किसी दिए गए प्रकार (एनम, स्ट्रिंग इत्यादि)

पर आधारित उचित पैरामीटर/गुणों के साथ उपयुक्त प्रकार उत्पन्न करने के लिए प्रदान की जाने वाली फैक्ट्री-प्रकार सेवाओं का उपयोग करने में सक्षम होना चाहिए, यदि नहीं, तो आप शायद फैक्ट्री क्लास बना सकते हैं इसमें एक विधि है जो पैरामीटर के आधार पर उपयुक्त प्रकार उत्पन्न करती है। यह विधि पैरामरे या अन्य ऑब्जेक्ट को स्वीकार कर सकती है जिसमें कैलक्यूलेटर को सही तरीके से सेट अप करने के लिए आवश्यक गुण होते हैं और फिर इसे आईकैल्यूलेटर इंटरफ़ेस के माध्यम से वापस कर देते हैं।

संबंधित मुद्दे