一起來學設計模式-----創建型模式之工廠方法
阿新 • • 發佈:2017-08-16
定義 修改 microsoft png ont 其他 urn 設計模式 cto
工廠方法模式,在簡單工廠上再深一層,簡單工廠裏有一個弊端,就是在方法裏是根據用戶的輸入直接返回子類對象。在工廠方法裏,定義了一個用於創建對象的接口,讓子類決定實例化哪一個類,工廠方法使得一個類的實例化延遲到了子類。
以之前的操作運算為例,使用工廠方法代碼如下:
from abc import ABCMeta, abstractmethod class BaseOperation: def GetResult(self,a,b): result = 0 return result class OperationAdd(BaseOperation): def __int__(self,a,b): self.a = a self.b = b def GetResult(self,a,b): result = 0 result = a + b return result class OperationSub(BaseOperation): def __int__(self,a,b): self.a = a self.b = b def GetResult(self,a,b): result = 0 result = a - b return result class OperationMul(BaseOperation): def GetResult(self,a,b): result = 0 result = a * b return result class OperationDiv(BaseOperation): def GetResult(self,a,b): result = 0 if b == 0 : raise ValueError("no 0 !") result = a/b return result class IFactory: @abstractmethod def CreateOperation(self): pass class AddFactory(IFactory): def CreateOperation(self): return OperationAdd() class SubFactory(IFactory): def CreateOperation(self): return OperationSub() class MulFactory(IFactory): def CreateOperation(self): return OperationMul() class DivFactory(IFactory): def CreateOperation(self): return OperationDiv() def main(): operFactory = AddFactory() oper = operFactory.CreateOperation() print oper.GetResult(2,4) if __name__ == ‘__main__‘: main()
客戶端在使用時,需要決定由於哪一個工廠來實例化類,每個類都有自己的工廠,選擇好工廠,就能實例化得到這個工程所有的類。此時如果需要增加一個運行操作,完全不需要修改其他的業務邏輯,增加運算類和自己的工廠即可。UML類圖如下所示
對比兩個模式下的UML圖,很快就能發現不同,簡單的工廠在服務端有個方法,用於接收客戶端的參數,從而實例化不同的對象,客戶端只關心傳入自己的參數,獲取想要的對象即可。而工廠方法沒有這個函數,客戶端需要清楚知道自己要使用哪一個工廠。增加一個運算類時, 簡單工廠是修改工廠類,而工廠方法是需要修改工廠類的,而工廠方法需要修改客戶端
一起來學設計模式-----創建型模式之工廠方法