VB.net+工厂方法模式+思考

来源:互联网 发布:淘宝客还能做吗 编辑:程序博客网 时间:2024/06/05 18:10

同上一个简单工厂模式一样,都是那计算器来说事,先看UML图。

 

在客户端(form1)中,通过对工厂子类的实现来操作具体的计算类。

Factory Method:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

和简单工厂模式不同的是这里把一个大的工厂(原先用来控制所有具体计算类)分解为了相应的小工厂,并且把实例化的过程放到了子类中来实现。

如果说在简单工厂模式中要添加一个新的类比如说M开N次方类,需要修改的地方为工厂内部的判断逻辑。

相应的放在工厂方法中时,对于所有类不用做任何修改,这样就遵循了开闭原则。不过工厂方法中的逻辑判断是放在客户端来进行的,所以要改动客户端中的判断。

 


思考:如果说我的简单工厂中通过反射机制来进行类的生成(这样就可以不用if—else或者是select case)因此也就不会因为新加一个类而改变其他类,这也遵循了开闭原则。相应的在工厂方法中通过反射也一样可以不对原有类进行改变,那么这样来说简单工厂和工厂方法哪个更好一些呢?相比较来说工厂方法反而麻烦了。

引用《Head First设计模式》中关于工厂方法模式的话:“我可以把你的客户端代码从需要实例化的具体类中解耦。或者如果你目前还不知道将来要实例化哪些具体类时,也可以用我。我的使用方法很简单,只要把我继承成子类,并实现我的工厂方法就可以了。”

关于简单工厂和工厂方法模式的比较不是很理解,下面给出vb.net版的工厂方法模式代码:

客户端:

view plaincopy to clipboardprint?
Public Class Form1  
Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click  
'首先定义一个对象  
Dim operFactory As Object 
Select Case cmbOperator.Text  
Case "+" '根据不同的符号返回不同的工厂  
operFactory = New AddFactory  
Case "-" 
operFactory = New SubFactory  
Case "*" 
operFactory = New MulFactory  
Case "/" 
operFactory = New DivFactory  
Case Else 
operFactory = Nothing 
End Select 
Dim oper As New Operation '定义一个运算对象  
oper = operFactory.CreatOperation() '返回具体的运算类  
oper.NumberA = CDbl(txtNumA.Text)  
oper.NumberB = CDbl(txtNumB.Text)  
lblResult.Text = oper.GetResult() '得到最后结果  
End Sub 
End Class 
Public Class Form1
Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click
'首先定义一个对象
Dim operFactory As Object
Select Case cmbOperator.Text
Case "+" '根据不同的符号返回不同的工厂
operFactory = New AddFactory
Case "-"
operFactory = New SubFactory
Case "*"
operFactory = New MulFactory
Case "/"
operFactory = New DivFactory
Case Else
operFactory = Nothing
End Select
Dim oper As New Operation '定义一个运算对象
oper = operFactory.CreatOperation() '返回具体的运算类
oper.NumberA = CDbl(txtNumA.Text)
oper.NumberB = CDbl(txtNumB.Text)
lblResult.Text = oper.GetResult() '得到最后结果
End Sub
End Class

工厂类:

view plaincopy to clipboardprint?
'构建工厂接口  
Public Interface IFactory  
Function CreatOperation() As Operation  
End Interface 
'构建各个运算的工厂  
'加法工厂  
Public Class AddFactory : Implements IFactory  
Function CreatOperation() As Operation Implements IFactory.CreatOperation  
Return New OperateAdd  
End Function 
End Class 
'减法工厂  
Public Class SubFactory : Implements IFactory  
Public Function CreatOperation() As Operation Implements IFactory.CreatOperation  
Return New OperateSub  
End Function 
End Class 
'乘法工厂  
Public Class MulFactory : Implements IFactory  
Public Function CreatOperation() As Operation Implements IFactory.CreatOperation  
Return New OperateMul  
End Function 
End Class 
'除法工厂  
Public Class DivFactory : Implements IFactory  
Public Function CreatOperation() As Operation Implements IFactory.CreatOperation  
Return New OperateDiv  
End Function 
End Class 
'构建工厂接口
Public Interface IFactory
Function CreatOperation() As Operation
End Interface
'构建各个运算的工厂
'加法工厂
Public Class AddFactory : Implements IFactory
Function CreatOperation() As Operation Implements IFactory.CreatOperation
Return New OperateAdd
End Function
End Class
'减法工厂
Public Class SubFactory : Implements IFactory
Public Function CreatOperation() As Operation Implements IFactory.CreatOperation
Return New OperateSub
End Function
End Class
'乘法工厂
Public Class MulFactory : Implements IFactory
Public Function CreatOperation() As Operation Implements IFactory.CreatOperation
Return New OperateMul
End Function
End Class
'除法工厂
Public Class DivFactory : Implements IFactory
Public Function CreatOperation() As Operation Implements IFactory.CreatOperation
Return New OperateDiv
End Function
End Class

运算类:

view plaincopy to clipboardprint?
'首先写出一个运算的基类  
Public Class Operation  
Private _NumberA As Double = 0  
Private _NumberB As Double = 0  
Public Property NumberA()  
Get 
Return _NumberA  
End Get 
Set(ByVal value)  
_NumberA = value  
End Set 
End Property 
Public Property NumberB()  
Get 
Return _NumberB  
End Get 
Set(ByVal value)  
_NumberB = value  
End Set 
End Property 
Public Overridable Function GetResult() As Double 
Dim result As Double = 0  
Return result  
End Function 
End Class 
'下面写出所有的具体计算类,均继承基类  
'加法计算类  
Public Class OperateAdd : Inherits Operation  
Public Overrides Function GetResult() As Double 
Dim result As Double = 0  
result = NumberA + NumberB  
Return result  
End Function 
End Class 
'下面是减法类  
Public Class OperateSub : Inherits Operation  
Public Overrides Function GetResult() As Double 
Dim result As Double = 0  
result = NumberA - NumberB  
Return result  
End Function 
End Class 
'乘法类  
Public Class OperateMul : Inherits Operation  
Public Overrides Function GetResult() As Double 
Dim result As Double = 0  
result = NumberA * NumberB  
Return result  
End Function 
End Class 
'除法类  
Public Class OperateDiv : Inherits Operation  
Public Overrides Function GetResult() As Double 
Dim result As Double = 0  
result = NumberA / NumberB  
Return result  
End Function 
End Class