2012-11-07 26 views
5

Xin chào các bạn, tôi có một chút vấn đề về thiết kế. Tôi tạo ra một máy tính tỷ lệ như sau:Sử dụng các lớp chung trừu tượng trong mẫu thiết kế phần mềm nhà máy

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 

tôi có thể làm một cái gì đó như thế này:

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

Khá đơn giản. Vấn đề là mỗi loại máy tính có bộ thuộc tính riêng của chúng cần được thiết lập để các phương thức Calculate() của chúng hoạt động đúng. Vì vậy, tôi sẽ chỉ phải thực hiện như sau

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 

cách tốt nhất sử dụng Generics và lớp trừu tượng để tạo ra một mô hình nhà máy mà sẽ tạo ra một máy tính của một loại hình cụ tự động là gì ??

Tôi cần một giải pháp rất chung chung vì nhiều tỷ lệ tính toán sẽ được thêm và sửa đổi tất cả với thông số riêng của chúng cần thiết cho logic tính toán. Tôi muốn có thể thực hiện điều này một cách nhanh chóng và có thể kiểm soát việc tính toán tỷ lệ này thông qua db. Câu trả lời FYI trong C# hoặc VB.Net được chào đón :) Cảm ơn bạn trước!

+0

Đây có phải là vb.net không? Vui lòng thêm thẻ ngôn ngữ để thu hút thêm sự chú ý. –

+0

Cảm ơn. Và có của nó trong VB.Net ngay bây giờ nhưng tôi có thể được chuyển đổi sang C# do đó, hoặc cú pháp sẽ giúp đỡ. Tôi quan tâm nhiều hơn đến thiết kế. Cảm ơn một lần nữa. – user1794228

Trả lời

0

Chỉ giữ giao diện ICalculator và chuyển đổi giao diện cụ thể hơn cho lớp học. Tôi không thể nghĩ ra một lý do chính đáng tại sao bạn sẽ tạo ra một lớp chỉ để lưu trữ một biến, vì vậy tôi sẽ loại bỏ hoàn toàn 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 

Bạn tạo thể hiện đối tượng bằng cách thông qua một tỷ lệ và một loại tốc độ với phương pháp GetCalculator. Tôi không biết ý bạn là gì bởi CalculationRule, nhưng nếu điều đó quan trọng đối với người dùng cuối thì bạn nên thêm nó làm thông số bổ sung.

Bạn có thể dễ dàng thêm các loại máy tính khác thực hiện ICalculator, miễn là bạn không quên cập nhật câu lệnh chọn trong phương thức gốc.

EDIT: tất nhiên bạn cũng có thể đặt thuộc tính bổ sung trước khi trả về một cá thể đối tượng. Tuy nhiên, điểm của mẫu này là để đảm bảo rằng người dùng cuối không cần biết về cách thực hiện Calculate(). Nếu bạn muốn làm cho các phương pháp nhà máy cụ thể hơn cho mỗi máy tính, nó loại thất bại mục đích.

0

Bạn có quen thuộc với bất kỳ vùng chứa IoC nào không? Bạn có thể sử dụng các dịch vụ kiểu nhà máy mà họ cung cấp để tạo cho bạn các loại thích hợp với các thông số/thuộc tính thích hợp dựa trên một loại nhất định (enum, string, v.v.)

Nếu không, bạn có thể tạo ra một nhà máy có một phương thức tạo kiểu thích hợp dựa trên một tham số. Phương thức này có thể chấp nhận một ParamArray hoặc đối tượng khác có chứa các thuộc tính cần thiết để thiết lập chính xác máy tính và sau đó trả về nó, thông qua giao diện ICalculator.