欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python版簡單工廠模式

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

什么是簡單工廠模式

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

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

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

題目分析:

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

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


代碼實現(xiàn):

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

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

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

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

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.  那么如何讓計算器知道我是要用哪一種運算呢?也就是說到底要實例化哪一個具體的運算類,Add?Sub?Mul?Div?這時就應(yīng)該考慮用 一個單獨的類來做這個創(chuàng)造具體實例的過程,這個類就是工廠類。如下:

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

5. 這樣,用戶只要輸入運算符,工廠類就可以創(chuàng)建合適的實例,通過多態(tài)性,即返回給父類的方式實現(xiàn)運算結(jié)果??蛻舳舜a如下:

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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • numpy.linspace函數(shù)具體使用詳解

    numpy.linspace函數(shù)具體使用詳解

    這篇文章主要介紹了numpy.linspace具體使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • DjangoRestFramework 使用 simpleJWT 登陸認證完整記錄

    DjangoRestFramework 使用 simpleJWT 登陸認證完整記錄

    Djangorestframework-simplejwt是Django REST Framework框架的一個jwt插件,使用 python http 工具進行接口測試的方法文中給大家提到,重點給大家分享djangorestframework-simplejwt 使用記錄及登陸認證的完成過程,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • Python中return語句用法實例分析

    Python中return語句用法實例分析

    這篇文章主要介紹了Python中return語句用法,實例分析了Python中return語句的功能、原理與使用方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • django和flask哪個值得研究學(xué)習(xí)

    django和flask哪個值得研究學(xué)習(xí)

    在本篇文章里小編給大家整理的是一篇關(guān)于django和flask哪個值得研究學(xué)習(xí)內(nèi)容,需要的朋友們可以參考下。
    2020-07-07
  • python的mysqldb安裝步驟詳解

    python的mysqldb安裝步驟詳解

    這篇文章主要介紹了python的mysqldb安裝步驟詳解的相關(guān)資料,這里提供實現(xiàn)的具體步驟,需要的朋友可以參考下
    2017-08-08
  • Python參數(shù)類型以及常見的坑詳解

    Python參數(shù)類型以及常見的坑詳解

    這篇文章主要介紹了Python參數(shù)類型以及常見的坑詳解,由于之前遇到過幾次有關(guān)于參數(shù)類型的坑,以及經(jīng)常容易把一些參數(shù)類型搞混淆,現(xiàn)在做一下有關(guān)參數(shù)類型的總結(jié)記錄以及對之前踩坑經(jīng)歷的分析,需要的朋友可以參考下
    2019-07-07
  • 使用Flink與Python進行實時數(shù)據(jù)處理的基本步驟

    使用Flink與Python進行實時數(shù)據(jù)處理的基本步驟

    Apache Flink是一個流處理框架,用于實時處理和分析數(shù)據(jù)流,PyFlink是Apache Flink的Python API,它允許用戶使用Python語言來編寫Flink作業(yè),進行實時數(shù)據(jù)處理,以下是如何使用Flink與Python進行實時數(shù)據(jù)處理的基本步驟,需要的朋友可以參考下
    2024-09-09
  • Python爬蟲基礎(chǔ)之selenium庫的用法總結(jié)

    Python爬蟲基礎(chǔ)之selenium庫的用法總結(jié)

    今天帶大家來學(xué)習(xí)selenium庫的使用方法及相關(guān)知識總結(jié),文中非常詳細的介紹了selenium庫,對正在學(xué)習(xí)python的小伙伴很有幫助,需要的朋友可以參考下
    2021-05-05
  • wxPython使用系統(tǒng)剪切板的方法

    wxPython使用系統(tǒng)剪切板的方法

    這篇文章主要介紹了wxPython使用系統(tǒng)剪切板的方法,涉及Python使用wx模塊操作系統(tǒng)剪切板的技巧,需要的朋友可以參考下
    2015-06-06
  • PO模式在selenium自動化測試框架的優(yōu)勢

    PO模式在selenium自動化測試框架的優(yōu)勢

    大家都知道po模式可以提高代碼的可讀性和減少了代碼的重復(fù),但是相對的缺點還有,今天通過本文一起學(xué)習(xí)下PO模式在selenium自動化測試框架的優(yōu)勢,需要的朋友可以參考下
    2022-03-03

最新評論