工廠方法模式簡介 定義 定義一個用於創建對象的介面,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。 簡單工廠 VS 工廠方法 簡單工廠:在工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。但是,當在工廠類中需要添加新的實例 ...
工廠方法模式簡介
定義
定義一個用於創建對象的介面,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
簡單工廠 VS 工廠方法
- 簡單工廠:在工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。但是,當在工廠類中需要添加新的實例化對象類時,需要修改工廠類,這樣就違背了“開-閉原則”。
- 工廠方法:工廠方法模式就是為瞭解決簡單工廠模式中存在的問題。通過創建工廠類介面,將具體的實例化的功能,下放到子類去實現,這樣,當需要添加新實例化對象類時,就無需去修改工廠類,只需依據工廠類介面,實現一個新的類即可。這也體現出來了“依賴倒轉”原則。但是,這樣做的缺點是,將必要的邏輯判斷下放到了客戶端程式中,不是一個好的選擇。當然,這樣的情況,我們可以通過“反射”來解決。
案例
題目
用任意一種面向對象語言實現一個計算器控制台程式。要求輸入兩個數和運算符號,得到結果。
代碼實現
#!/usr/bin/env python # _*_ coding utf-8 _*_ #Author: aaron import abc class Operation(object): def __init__(self, NumberA=0, NumberB=0): self.NumberA = NumberA self.NumberB = NumberB def GetResult(self): pass class AddOp(Operation): def GetResult(self): return self.NumberB + self.NumberA class MinusOp(Operation): def GetResult(self): return self.NumberA - self.NumberB class MultiOp(Operation): def GetResult(self): return self.NumberA * self.NumberB class DivideOp(Operation): def GetResult(self): try: return 1.0 * self.NumberA / self.NumberB except ZeroDivisionError: raise class Factory(metaclass=abc.ABCMeta): @abc.abstractmethod def create_factory(self): '''工廠類抽象介面''' class AddFactory(Factory): def create_factory(self): return AddOp() class MinusFactory(Factory): def create_factory(self): return MinusOp() class MultiFactory(Factory): def create_factory(self): return MultiOp() class DivideFactory(Factory): def create_factory(self): return DivideOp() if __name__ == '__main__': ch = '' while not ch == 'q': NumberA = eval(input('Please input number1: ')) op = str(input('Please input the operation: ')) NumberB = eval(input('Please input number2: ')) if op == '+': OPFactory = AddFactory() elif op == '-': OPFactory = MinusFactory() elif op == '*': OPFactory = MultiFactory() elif op == '/': OPFactory = DivideFactory() else: print('invilid input!') oper = OPFactory.create_factory() oper.NumberA = NumberA oper.NumberB = NumberB print('The result is:', oper.GetResult()) print('\n#-- input q to exit any key to continue') try: ch = str(input()) except: ch = ''