国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python版簡單工廠模式

2020-01-04 16:35:52
字體:
供稿:網(wǎng)友

什么是簡單工廠模式

工廠模式有一種非常形象的描述,建立對象的類就如一個(gè)工廠,而需要被建立的對象就是一個(gè)個(gè)產(chǎn)品;在工廠中加工產(chǎn)品,使用產(chǎn)品的人,不用在乎產(chǎn)品是如何生產(chǎn)出來的。從軟件開發(fā)的角度來說,這樣就有效的降低了模塊之間的耦合。
簡單工廠的作用是實(shí)例化對象,而不需要客戶了解這個(gè)對象屬于哪個(gè)具體的子類。簡單工廠實(shí)例化的類具有相同的接口或者基類,在子類比較固定并不需要擴(kuò)展時(shí),可以使用簡單工廠。如數(shù)據(jù)庫生產(chǎn)工廠就是簡單工廠的一個(gè)應(yīng)用
采用簡單工廠的優(yōu)點(diǎn)是可以使用戶根據(jù)參數(shù)獲得對應(yīng)的類實(shí)例,避免了直接實(shí)例化類,降低了耦合性;缺點(diǎn)是可實(shí)例化的類型在編譯期間已經(jīng)被確定,如果增加新類 型,則需要修改工廠,不符合OCP(開閉原則)的原則。簡單工廠需要知道所有要生成的類型,當(dāng)子類過多或者子類層次過多時(shí)不適合使用。

簡單工廠模式實(shí)現(xiàn)

下面考慮《大話設(shè)計(jì)模式》中的一個(gè)例子:
題目:用任意一種面向?qū)ο笳Z言實(shí)現(xiàn)一個(gè)計(jì)算器控制臺程序。要求輸入兩個(gè)數(shù)和運(yùn)算符號,得到結(jié)果。

題目分析:

程序應(yīng)該做到:(1)可維護(hù);(2)可復(fù)用;(3)可擴(kuò)展;(4)靈活性好。
可維護(hù):就是說代碼一處更改,不能產(chǎn)生連鎖反應(yīng),不能影響其他地方。
可復(fù)用:盡量減少重復(fù)性代碼。
可擴(kuò)展:如果要擴(kuò)展新的功能、新的業(yè)務(wù),則只需要增加新的類就好了,不對已有的類和邏輯產(chǎn)生影響。插拔式的應(yīng)用。
面向?qū)ο笠c(diǎn):
面向?qū)ο笕筇匦裕悍庋b、繼承、多態(tài)。
通過封裝、繼承、多態(tài)把程序耦合降低。
業(yè)務(wù)邏輯和界面邏輯分開。

類的結(jié)構(gòu)圖:

python,簡單工廠模式

代碼實(shí)現(xiàn):

1. 首先,搞清楚業(yè)務(wù)中容易發(fā)生變化的部分。在本應(yīng)用中,要求計(jì)算兩個(gè)數(shù)的運(yùn)算結(jié)果,那么要進(jìn)行什么樣的運(yùn)算,這就是一個(gè)容易發(fā)生變化的部分。例如,我們現(xiàn)在只想實(shí)現(xiàn)加減乘除運(yùn)算,后期又想增加開根或者求余運(yùn)算。那么如何應(yīng)對這種需求帶來的變化。在程序設(shè)計(jì)的時(shí)候就應(yīng)該考慮到程序的可維護(hù)性、可擴(kuò)展性、代碼的可復(fù)用性、靈活性等等。 

2. 例如現(xiàn)在這個(gè)運(yùn)算器只有加減乘除四種運(yùn)算。首先建一個(gè)Operation類,這個(gè)類是各種具體運(yùn)算類(加減乘除)的父類,主要是接受用戶輸入的數(shù)值。該類如下:

class Operation():   def __init__(self,NumberA=0,NumberB=0):     self.NumberA = NumberA     self.NumberB = NumberB    def GetResult(self):     pass 

3. 然后是具體的運(yùn)算類:Add、Sub、Mul、Div。他們都繼承了Operation類,并且重寫了getResult()方法。這樣就可以用多態(tài)性降低不同業(yè)務(wù)邏輯的耦合度,修改任何一種運(yùn)算類都不會(huì)影響其他的運(yùn)算類。具體類的代碼如下:

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 

4.  那么如何讓計(jì)算器知道我是要用哪一種運(yùn)算呢?也就是說到底要實(shí)例化哪一個(gè)具體的運(yùn)算類,Add?Sub?Mul?Div?這時(shí)就應(yīng)該考慮用 一個(gè)單獨(dú)的類來做這個(gè)創(chuàng)造具體實(shí)例的過程,這個(gè)類就是工廠類。如下:

class OperationFatory():   def ChooseOperation(self,op):     if op == '+':       return AddOp()     if op == '-':       return MinusOp()     if op == '*':       return MultiOp()     if op == '/':       return DivideOp() 

5. 這樣,用戶只要輸入運(yùn)算符,工廠類就可以創(chuàng)建合適的實(shí)例,通過多態(tài)性,即返回給父類的方式實(shí)現(xiàn)運(yùn)算結(jié)果。客戶端代碼如下:

if __name__ == '__main__':   ch = ''   while not ch=='q':      NumberA = eval(raw_input('Please input number1: '))     op = str(raw_input('Please input the operation: '))     NumberB = eval(raw_input('Please input number2: '))     OPFactory = OperationFatory()     OPType = OPFactory.ChooseOperation(op)     OPType.NumberA = NumberA     OPType.NumberB = NumberB     print 'The result is:',OPType.GetResult()     print '/n#-- input q to exit any key to continue'     try:       ch = str(raw_input())     except:       ch = '' 

完整版代碼如下:

# -*-coding:UTF-8-*-  from abc import ABCMeta,abstractmethod  class Operation():   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 OperationFatory():   def ChooseOperation(self,op):     if op == '+':       return AddOp()     if op == '-':       return MinusOp()     if op == '*':       return MultiOp()     if op == '/':       return DivideOp()  if __name__ == '__main__':   ch = ''   while not ch=='q':      NumberA = eval(raw_input('Please input number1: '))     op = str(raw_input('Please input the operation: '))     NumberB = eval(raw_input('Please input number2: '))     OPFactory = OperationFatory()     OPType = OPFactory.ChooseOperation(op)     OPType.NumberA = NumberA     OPType.NumberB = NumberB     print 'The result is:',OPType.GetResult()     print '/n#-- input q to exit any key to continue'     try:       ch = str(raw_input())     except:       ch = '' 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 五峰| 周口市| 邢台县| 安福县| 高台县| 宜宾县| 绩溪县| 湘阴县| 兴文县| 双城市| 阜康市| 包头市| 洛川县| 二手房| 峡江县| 北票市| 兴城市| 大邑县| 昂仁县| 仲巴县| 兴国县| 青岛市| 喀什市| 项城市| 辉南县| 平谷区| 平远县| 房产| 梅州市| 江都市| 大足县| 新营市| 丰县| 福鼎市| 布拖县| 深圳市| 盐城市| 贵溪市| 固安县| 鄂托克前旗| 崇阳县|