同上一個簡單原廠模式一樣,都是那計算機來說事,先看UML圖。
在用戶端(form1)中,通過對工廠子類的實現來操作具體的計算類。
Factory Method:定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory 方法使一個類的執行個體化延遲到其子類。
和簡單原廠模式不同的是這裡把一個大的工廠(原先用來控制所有具體計算類)分解為了相應的小工廠,並且把執行個體化的過程放到了子類中來實現。
如果說在簡單原廠模式中要添加一個新的類比如說M開N次方類,需要修改的地方為工廠內部的判斷邏輯。
相應的放在Factory 方法中時,對於所有類不用做任何修改,這樣就遵循了開閉原則。不過Factory 方法中的邏輯判斷是放在用戶端來進行的,所以要改動用戶端中的判斷。
思考:如果說我的簡單工廠中通過反射機制來進行類的產生(這樣就可以不用if—else或者是select case)因此也就不會因為新加一個類而改變其他類,這也遵循了開閉原則。相應的在Factory 方法中通過反射也一樣可以不對原有類進行改變,那麼這樣來說簡單工廠和Factory 方法哪個更好一些呢?相比較來說Factory 方法反而麻煩了。
引用《Head First設計模式》中關於Factory 方法模式的話:“我可以把你的用戶端代碼從需要執行個體化的具體類中解耦。或者如果你目前還不知道將來要執行個體化哪些具體類時,也可以用我。我的使用方法很簡單,只要把我繼承成子類,並實現我的Factory 方法就可以了。”
關於簡單工廠和Factory 方法模式的比較不是很理解,下面給出vb.net版的Factory 方法模式代碼:
用戶端:
Public Class Form1<br />Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click<br />'首先定義一個對象<br />Dim operFactory As Object<br />Select Case cmbOperator.Text<br />Case "+" '根據不同的符號返回不同的工廠<br />operFactory = New AddFactory<br />Case "-"<br />operFactory = New SubFactory<br />Case "*"<br />operFactory = New MulFactory<br />Case "/"<br />operFactory = New DivFactory<br />Case Else<br />operFactory = Nothing<br />End Select<br />Dim oper As New Operation '定義一個運算對象<br />oper = operFactory.CreatOperation() '返回具體的運算類<br />oper.NumberA = CDbl(txtNumA.Text)<br />oper.NumberB = CDbl(txtNumB.Text)<br />lblResult.Text = oper.GetResult() '得到最後結果<br />End Sub<br />End Class
工廠類:
'構建工廠介面<br />Public Interface IFactory<br />Function CreatOperation() As Operation<br />End Interface<br />'構建各個運算的工廠<br />'加法工廠<br />Public Class AddFactory : Implements IFactory<br />Function CreatOperation() As Operation Implements IFactory.CreatOperation<br />Return New OperateAdd<br />End Function<br />End Class<br />'減法工廠<br />Public Class SubFactory : Implements IFactory<br />Public Function CreatOperation() As Operation Implements IFactory.CreatOperation<br />Return New OperateSub<br />End Function<br />End Class<br />'乘法工廠<br />Public Class MulFactory : Implements IFactory<br />Public Function CreatOperation() As Operation Implements IFactory.CreatOperation<br />Return New OperateMul<br />End Function<br />End Class<br />'除法工廠<br />Public Class DivFactory : Implements IFactory<br />Public Function CreatOperation() As Operation Implements IFactory.CreatOperation<br />Return New OperateDiv<br />End Function<br />End Class
運算類:
'首先寫出一個運算的基類<br />Public Class Operation<br />Private _NumberA As Double = 0<br />Private _NumberB As Double = 0<br />Public Property NumberA()<br />Get<br />Return _NumberA<br />End Get<br />Set(ByVal value)<br />_NumberA = value<br />End Set<br />End Property<br />Public Property NumberB()<br />Get<br />Return _NumberB<br />End Get<br />Set(ByVal value)<br />_NumberB = value<br />End Set<br />End Property<br />Public Overridable Function GetResult() As Double<br />Dim result As Double = 0<br />Return result<br />End Function<br />End Class<br />'下面寫出所有的具體計算類,均繼承基類<br />'加法計算類<br />Public Class OperateAdd : Inherits Operation<br />Public Overrides Function GetResult() As Double<br />Dim result As Double = 0<br />result = NumberA + NumberB<br />Return result<br />End Function<br />End Class<br />'下面是減法類<br />Public Class OperateSub : Inherits Operation<br />Public Overrides Function GetResult() As Double<br />Dim result As Double = 0<br />result = NumberA - NumberB<br />Return result<br />End Function<br />End Class<br />'乘法類<br />Public Class OperateMul : Inherits Operation<br />Public Overrides Function GetResult() As Double<br />Dim result As Double = 0<br />result = NumberA * NumberB<br />Return result<br />End Function<br />End Class<br />'除法類<br />Public Class OperateDiv : Inherits Operation<br />Public Overrides Function GetResult() As Double<br />Dim result As Double = 0<br />result = NumberA / NumberB<br />Return result<br />End Function<br />End Class
PS:又好好看了一下Factory 方法,原來就是在從簡單工廠中在抽象出來一個抽象的工廠類 ,這樣靈活性就更高了。