[Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns
寫在前面的話
""" 讀書的時(shí)候上過《設(shè)計(jì)模式》這一門課,當(dāng)時(shí)使用的教材是程杰老師的《大話設(shè)計(jì)模式》,使用的語言是C#,學(xué)過課程之后初期深感面向?qū)ο笏枷氲膫ゴ?#xff0c;但是很少應(yīng)用到實(shí)際開發(fā)中。后來我接觸了Python,現(xiàn)在工作中用到最多的也是Python,或許是因?yàn)镻ython的便利性,我寫的很多腳本/程序都還是面向過程編程,缺少面向?qū)ο蟮乃枷朐诶镞?。因?#xff0c;我打算重讀程杰老師的《大話設(shè)計(jì)模式》并用Python進(jìn)行實(shí)踐。""" by ZH奶酪——張賀題目
用一種面向?qū)ο笳Z言實(shí)現(xiàn)一個(gè)計(jì)算器控制臺程序, 要求輸入兩個(gè)數(shù)和運(yùn)算符號(+-*/), 得到結(jié)果.
基礎(chǔ)版本
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點(diǎn)評
改進(jìn)版本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.點(diǎn)評
為什么活字印刷術(shù)能位列四大發(fā)明?主要是其方法的思想。
復(fù)制?復(fù)用?
如果做一個(gè)帶圖形化界面的計(jì)算器,上邊的代碼需要再寫一次。為了避免這樣,需要將業(yè)務(wù)邏輯與界面邏輯分開,降低耦合度。
改進(jìn)版本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點(diǎn)評
緊耦合?松耦合?
如果要支持一個(gè)開根號運(yùn)算,上邊的代碼需要改動(dòng)包括加減乘除在內(nèi)的get_result函數(shù),應(yīng)該將加減乘除運(yùn)算分離, 修改其中一個(gè)不影響其他的幾個(gè)。那么就需要定義一個(gè)Operator基類, 將get_result定義為虛函數(shù),然后通過繼承和多態(tài),分別實(shí)現(xiàn)加減乘除四個(gè)子類,每個(gè)子類中定義虛函數(shù)的實(shí)現(xiàn)邏輯。
參考資料: Python中的多態(tài)與虛函數(shù)
改進(jìn)版本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如何實(shí)例化?——簡單工廠模式
現(xiàn)在加減乘除的實(shí)現(xiàn)邏輯已經(jīng)進(jìn)一步隔離,之后即使增加一個(gè)開根號運(yùn)算符,也和加減乘除無關(guān)。那么如何去實(shí)例化這些類呢?可以用簡單工廠模式。
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通過上邊的簡單工廠,輸入運(yùn)算符號,就可以實(shí)例化出對應(yīng)的對象。下邊是客戶端的代碼。
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點(diǎn)評
轉(zhuǎn)載于:https://www.cnblogs.com/CheeseZH/p/9363197.html
總結(jié)
以上是生活随笔為你收集整理的[Python设计模式] 第1章 计算器——简单工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Android Studio] 初体验
- 下一篇: Selenium2+python自动化7