首先要求:如何实施配方工厂?
- 通过管理的要求,我不能使用开放的源代码。
- 我需要用户为项目定义他们自己的公式。
- 我的用户不知道如何编码。
- 公式需要以某种方式保存,并在稍后阅读。
- 我需要调试编写的公式,所以我需要能够看到并理解它们。
- 使用的公式是相当专业和特定的(精算公式)。
- 添加新公式(功能)必须以快速和可维护的方式完成。
我做了什么?
我实现了一个抽象类,让我们说FormulaBase所有公式继承:
Public MustInherit Class FormulaBase
Public MustInherit Function Formula(ByVal p as Parameters) as Result
Public MustInherit Function GetXML() as Text.StringBuilder
End Class
然后创建类,包装像这样的公式:
Public Class SumFormula
Inherits FormulaBase
Public Shared ReadOnly Property XMLTag() As String
Get
Return "sum"
End Get
End Property
Private X As FormulaBase
Private Y As FormulaBase
Public Sub New(ByVal xmlText as Xml.XmlNode)
' Code to obtain read the sum parameters form XML.'
End Sub
Public Overrides Function Formula(ByVal p as Parameters) as Result
Return X.Formula(p) + Y.Formula(p)
End Function
Public Override Function GetXml() as Text.StringBuilder
Return New Text.StringBuilder().Append("<sum>").Append(X.GetXml()).Append(Y.GetXml()).Append("</sum>")
End Function
End Class
然后,我创建了一个工厂建设公式,像这样:
Public NotInheritable Class FormulaFactory
Private Shared Formulas As Dictionary(Of String, Reflection.ConstructorInfo) = InitializeFormulas()
Private Shared Sub Add(ByVal collection As Dictionary(Of String, Reflection.ConstructorInfo), ByVal formula as Type)
' Some code to extract the contructor and XmlTag from each class and add them to the dictionary.'
End Sub
Private Shared Function InitializeFormulas() As Dictionary(Of String, Reflection.ConstructorInfo)
Dim Collection As New Dictionary(Of String, Reflection.ConstructorInfo)
Add(Collection, GetType(SumFormula))
Return Collection
End Sub
Public Shared Function ConstructFormula(xmlText as Xml.XmlNode) as FormulaBase
Return DirectCast(Formulas(xmlText).Invoke(New Object(){xmlText}), FormulaBase)
End Function
End Class
我使用一些更多的魔法向用户展示公式,以便他们不会看到XML。要添加一个新公式,我只需要创建包装类,添加一个Shared XMLTag属性和一个将XMLNode作为参数的构造函数。然后我在FormulaFactory.InitializeFormulas方法中添加一行。
问题是,是否有其他方式可以离开?
我会检查它,但我不能使用开源。 :'( 我已经添加了要求的限制 – Wilhelm 2009-07-03 01:35:32