[Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns
寫在前面的話
""" 讀書的時候上過《設計模式》這一門課,當時使用的教材是程杰老師的《大話設計模式》,使用的語言是C#,學過課程之后初期深感面向?qū)ο笏枷氲膫ゴ?#xff0c;但是很少應用到實際開發(fā)中。后來我接觸了Python,現(xiàn)在工作中用到最多的也是Python,或許是因為Python的便利性,我寫的很多腳本/程序都還是面向過程編程,缺少面向?qū)ο蟮乃枷朐诶镞叀R虼?#xff0c;我打算重讀程杰老師的《大話設計模式》并用Python進行實踐。""" by ZH奶酪——張賀題目
用一種面向?qū)ο笳Z言實現(xiàn)一個計算器控制臺程序, 要求輸入兩個數(shù)和運算符號(+-*/), 得到結果.
基礎版本
a = int(input("input a number:")) b = str(input("input a operater(+ - * /):")) c = int(input("input a number:"))if b == "+":print(a+c) elif b == "-":print(a-c) elif b == "*":print(a*c) else b == "/":print(a/c) input a number:16 input a operater(+ - * /):* input a number:2 32點評
改進版本1.0——規(guī)范代碼
number_a = int(input("input a number:")) operator = str(input("input a operater(+ - * /):")) number_b = int(input("input a number:"))if operator == "+":print(number_a + number_b) elif operator == "-":print(number_a - number_b) elif operator == "*":print(number_a * number_b) elif operator == "/":if number_b != 0:print(number_a / number_b)else:print("With operator '/', the second number can not be zero.") else:print("Wrong operator.") input a number:12 input a operater(+ - * /):/ input a number:0 With operator '/', the second number can not be zero.點評
為什么活字印刷術能位列四大發(fā)明?主要是其方法的思想。
復制?復用?
如果做一個帶圖形化界面的計算器,上邊的代碼需要再寫一次。為了避免這樣,需要將業(yè)務邏輯與界面邏輯分開,降低耦合度。
改進版本2.0——利用封裝解耦
class Operation():def __init__(self):self.result = Nonedef get_result(self, number_a, number_b, operator):if operator == "+":self.result = number_a + number_belif operator == "-":self.result = number_a - number_belif operator == "*":self.result = number_a * number_belif operator == "/":if number_b != 0:self.result = number_a / number_belse:print("With operator '/', the second number can not be zero.")else:print("Wrong operator.")return self.resultnumber_a = int(input("input a number:")) operator = str(input("input a operater(+ - * /):")) number_b = int(input("input a number:"))operation = Operation() print(operation.get_result(number_a, number_b, operator)) input a number:12 input a operater(+ - * /):+ input a number:12 24點評
緊耦合?松耦合?
如果要支持一個開根號運算,上邊的代碼需要改動包括加減乘除在內(nèi)的get_result函數(shù),應該將加減乘除運算分離, 修改其中一個不影響其他的幾個。那么就需要定義一個Operator基類, 將get_result定義為虛函數(shù),然后通過繼承和多態(tài),分別實現(xiàn)加減乘除四個子類,每個子類中定義虛函數(shù)的實現(xiàn)邏輯。
參考資料: Python中的多態(tài)與虛函數(shù)
改進版本3.0——簡單工廠模式
from abc import ABCMeta, abstractmethodclass Operation():__metaclass__ = ABCMetadef __init__(self):self.result = None@abstractmethoddef get_result(self):passclass AddOperation(Operation):def get_result(self, number_a, number_b):self.result = number_a + number_breturn self.resultclass SubOperation(Operation):def get_result(self, number_a, number_b):self.result = number_a - number_breturn self.resultclass MulOperation(Operation):def get_result(self, number_a, number_b):self.result = number_a * number_breturn self.resultclass DivOperation(Operation):def get_result(self, number_a, number_b):if number_b == 0:print("With operator '/', the second number can not be zero.")return self.resultself.result = number_a / number_breturn self.result如何實例化?——簡單工廠模式
現(xiàn)在加減乘除的實現(xiàn)邏輯已經(jīng)進一步隔離,之后即使增加一個開根號運算符,也和加減乘除無關。那么如何去實例化這些類呢?可以用簡單工廠模式。
class OperationFactory():@classmethoddef create_operate(self, operator):oper = Noneif operator == "+":oper = AddOperation()elif operator == "-":oper = SubOperation()elif operator == "*":oper = MulOperation()elif operator == "/":oper = DivOperation()else:print("Wrong operator.")return oper通過上邊的簡單工廠,輸入運算符號,就可以實例化出對應的對象。下邊是客戶端的代碼。
number_a = int(input("input a number:")) operator = str(input("input a operater(+ - * /):")) number_b = int(input("input a number:"))oper = OperationFactory.create_operate(operator) print(oper.get_result(number_a, number_b)) input a number:12 input a operater(+ - * /):- input a number:12 0點評
轉(zhuǎn)載于:https://www.cnblogs.com/CheeseZH/p/9363197.html
總結
以上是生活随笔為你收集整理的[Python设计模式] 第1章 计算器——简单工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Android Studio] 初体验
- 下一篇: Salesforce 小知识:大量“子记