最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python版簡(jiǎn)單工廠模式

 更新時(shí)間:2017年10月16日 17:09:34   作者:金手指三腳貓  
這篇文章主要為大家詳細(xì)介紹了python版簡(jiǎn)單工廠模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

什么是簡(jiǎn)單工廠模式

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

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

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

題目分析:

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

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


代碼實(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)算,后期又想增加開(kāi)根或者求余運(yùn)算。那么如何應(yīng)對(duì)這種需求帶來(lái)的變化。在程序設(shè)計(jì)的時(shí)候就應(yīng)該考慮到程序的可維護(hù)性、可擴(kuò)展性、代碼的可復(fù)用性、靈活性等等。 

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

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

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

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)算呢?也就是說(shuō)到底要實(shí)例化哪一個(gè)具體的運(yùn)算類(lèi),Add?Sub?Mul?Div?這時(shí)就應(yīng)該考慮用 一個(gè)單獨(dú)的類(lèi)來(lái)做這個(gè)創(chuàng)造具體實(shí)例的過(guò)程,這個(gè)類(lèi)就是工廠類(lèi)。如下:

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

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

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 = '' 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談Python如何獲取excel數(shù)據(jù)

    淺談Python如何獲取excel數(shù)據(jù)

    這篇文章主要介紹了Python如何獲取excel數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • 一篇文章帶你了解python正則表達(dá)式的正確用法

    一篇文章帶你了解python正則表達(dá)式的正確用法

    這篇文章主要介紹了Python中正則表達(dá)式的詳細(xì)教程,正則表達(dá)式是Python學(xué)習(xí)進(jìn)階當(dāng)中的重要內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Python Flask 轉(zhuǎn)換器的使用詳解

    Python Flask 轉(zhuǎn)換器的使用詳解

    這篇文章主要介紹了Python_Flask 轉(zhuǎn)換器的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 如何利用Python實(shí)現(xiàn)自動(dòng)打卡簽到的實(shí)踐

    如何利用Python實(shí)現(xiàn)自動(dòng)打卡簽到的實(shí)踐

    簽到,都是規(guī)律性的操作,何嘗不寫(xiě)一個(gè)程序加到Windows實(shí)現(xiàn)自動(dòng)簽到呢,本文就主要介紹了如何利用Python實(shí)現(xiàn)自動(dòng)打卡簽到的實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • Django admin.py 在修改/添加表單界面顯示額外字段的方法

    Django admin.py 在修改/添加表單界面顯示額外字段的方法

    今天小編就為大家分享一篇Django admin.py 在修改/添加表單界面顯示額外字段的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Python實(shí)現(xiàn)線(xiàn)性判別分析(LDA)的MATLAB方式

    Python實(shí)現(xiàn)線(xiàn)性判別分析(LDA)的MATLAB方式

    今天小編大家分享一篇Python實(shí)現(xiàn)線(xiàn)性判別分析(LDA)的MATLAB方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 跟老齊學(xué)Python之字典,你還記得嗎?

    跟老齊學(xué)Python之字典,你還記得嗎?

    在python中,也有一種數(shù)據(jù)與此相近,不僅相近,這種數(shù)據(jù)的名稱(chēng)就叫做dictionary,翻譯過(guò)來(lái)是字典,類(lèi)似于前面的int/str/list,這種類(lèi)型數(shù)據(jù)名稱(chēng)是:dict
    2014-09-09
  • python實(shí)現(xiàn)簡(jiǎn)單socket程序在兩臺(tái)電腦之間傳輸消息的方法

    python實(shí)現(xiàn)簡(jiǎn)單socket程序在兩臺(tái)電腦之間傳輸消息的方法

    這篇文章主要介紹了python實(shí)現(xiàn)簡(jiǎn)單socket程序在兩臺(tái)電腦之間傳輸消息的方法,涉及Python操作socket的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • TensorFlow2.1.0最新版本安裝詳細(xì)教程

    TensorFlow2.1.0最新版本安裝詳細(xì)教程

    TensorFlow是一款優(yōu)秀的深度學(xué)習(xí)框架,支持多種常見(jiàn)的操作系統(tǒng),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,這篇文章主要介紹了TensorFlow2.1.0最新版本安裝詳細(xì)教程,需要的朋友可以參考下
    2020-04-04
  • python讀取視頻流提取視頻幀的兩種方法

    python讀取視頻流提取視頻幀的兩種方法

    這篇文章主要為大家詳細(xì)介紹了python讀取視頻流提取視頻幀的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04

最新評(píng)論

班玛县| 石景山区| 宁波市| 同心县| 长武县| 长白| 加查县| 临夏市| 扶沟县| 邢台县| 栖霞市| 蓬溪县| 辛集市| 巫溪县| 牡丹江市| 鹤庆县| 昭苏县| 苏尼特左旗| 维西| 龙口市| 蚌埠市| 潢川县| 瑞昌市| 通江县| 宝坻区| 衡阳市| 桂阳县| 康保县| 四子王旗| 嘉祥县| 高清| 岗巴县| 新平| 松潘县| 克什克腾旗| 洛浦县| 文登市| 保山市| 新沂市| 微博| 志丹县|