1. 程式人生 > >一起來學設計模式-----創建型模式之工廠方法

一起來學設計模式-----創建型模式之工廠方法

定義 修改 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圖,很快就能發現不同,簡單的工廠在服務端有個方法,用於接收客戶端的參數,從而實例化不同的對象,客戶端只關心傳入自己的參數,獲取想要的對象即可。而工廠方法沒有這個函數,客戶端需要清楚知道自己要使用哪一個工廠。增加一個運算類時, 簡單工廠是修改工廠類,而工廠方法是需要修改工廠類的,而工廠方法需要修改客戶端

一起來學設計模式-----創建型模式之工廠方法