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

使用簡單工廠模式來進(jìn)行Python的設(shè)計(jì)模式編程

 更新時(shí)間:2016年03月01日 09:22:33   作者:BlueWish  
這篇文章主要介紹了使用簡單工廠模式來進(jìn)行Python的設(shè)計(jì)模式編程的方法,需要的朋友可以參考下

計(jì)模式的目的是讓代碼易維護(hù)、易擴(kuò)展,不能為了模式而模式,因此一個(gè)簡單的工具腳本是不需要用到任何模式的。

簡單工廠模式又叫靜態(tài)工廠方法模式,工廠模式家族中最簡單的一種模式。這個(gè)模式的基本工作方式: 通過一個(gè)工廠來決定創(chuàng)建哪種具體的產(chǎn)品實(shí)例。

下面是一個(gè)簡單的工廠實(shí)例:

def create_animal(name):
 if name == 'dog':
  return Dog()
 elif name == 'cat':
  return Cat()

animal = create_animal('dog')
animal.eat('some food')

create_animal就是一個(gè)工廠,各種動(dòng)物就是產(chǎn)品,該工廠根據(jù)name來決定產(chǎn)出什么動(dòng)物產(chǎn)品。產(chǎn)品應(yīng)該具有一個(gè)基本特性,同一個(gè)工廠出產(chǎn)的所有產(chǎn)品都是一個(gè)系列,都具有相同的功能,比如動(dòng)物都吃食物。

簡單工廠模式的好處是可以將產(chǎn)品對象的細(xì)節(jié)封裝在其實(shí)現(xiàn)類的內(nèi)部,改變一個(gè)產(chǎn)品對象具體實(shí)現(xiàn)不會影響其他產(chǎn)品。可擴(kuò)展性強(qiáng),當(dāng)需要新增產(chǎn)品類型時(shí),只需要添加對應(yīng)的實(shí)現(xiàn)類,然后修改工廠,增加一個(gè)判斷分支即可。修改工廠函數(shù)帶來的風(fēng)險(xiǎn)比較低。

另外一個(gè)比較典型的適合簡單工廠模式的例子是計(jì)算器,計(jì)算器需要支持各種計(jì)算操作,比如加、減、乘、除、平方、立方、平方根、階乘等等。那么這里的工廠就是要?jiǎng)?chuàng)建各種操作算法對象,每種操作算法對象都支持一個(gè)求值方法。

def create_operator(op):
 if op == '+':
  return AddOperation()
 elif op == '-':
  return SubOperation()
 elif op == '*':
  return MulOperation()
 elif op == '/':
  return DivOperation()

op = create_operator('+')
op.Calc(1, 2)

前面提到,每個(gè)工廠生產(chǎn)的產(chǎn)品都是一個(gè)系列的,因此產(chǎn)品類通常會從同一個(gè)抽象基類派生,但不是必須的。


簡單工廠模式的組成要素:
工廠函數(shù):負(fù)責(zé)具體產(chǎn)品對象的創(chuàng)建工作,是該模式的核心。當(dāng)場景比較復(fù)雜時(shí),可能需要用一個(gè)工廠類來負(fù)責(zé)產(chǎn)品的創(chuàng)建。
以及產(chǎn)品的抽象接口或抽象類、抽象所有產(chǎn)品的公共接口、具體產(chǎn)品類、抽象接口的具體實(shí)現(xiàn)類。

缺點(diǎn):
由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類中
它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了
當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時(shí)候,可能會出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實(shí)例的需求.這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯(cuò)在一起,很難避免模塊功能的蔓延,對系統(tǒng)的維護(hù)和擴(kuò)展非常不利;

使用場景:
工廠類負(fù)責(zé)創(chuàng)建的對象比較少;
客戶只知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象(邏輯)不關(guān)心;
由于簡單工廠很容易違反高內(nèi)聚責(zé)任分配原則,因此一般只在很簡單的情況下應(yīng)用。


eg:采用簡單工廠模式實(shí)現(xiàn)計(jì)算器

#encoding=utf-8 
# 
#by panda 
#簡單工廠模式 
 
class OperateBase(): 
 result = 0; 
 def GetResult(self): 
  return self.result; 
 
class OperationAdd(OperateBase): 
 def __init__(self, NumA, NumB): 
  self.result = NumA + NumB; 
 def GetResult(self): 
  return self.result;   
  
class OperationSub(OperateBase): 
 def __init__(self, NumA, NumB): 
  self.result = NumA - NumB; 
 def GetResult(self): 
  return self.result; 
  
class OperationMult(OperateBase): 
 def __init__(self, NumA, NumB): 
  self.result = NumA * NumB; 
 def GetResult(self): 
  return self.result; 
 
class OperationDiv(OperateBase): 
 def __init__(self, NumA, NumB): 
  self.result = NumA / NumB; 
 def GetResult(self): 
  return self.result; 
 
class OperationFactory(): 
 @staticmethod 
 def createOperate(operate, NumA, NumB): 
  optList = { 
  '+':OperationAdd, 
  '-':OperationSub, 
  '*':OperationMult, 
  '/':OperationDiv,   
  } 
  oper = OperateBase() 
  if(optList.has_key(operate)): 
   oper = optList[operate](NumA, NumB);   
  return oper 
 
 
def clientUI(): 
 opt = raw_input("please input a operation(+-*/): "); 
 NumA = raw_input("please input the first number: "); 
 NumB = raw_input("please input the second number: ");  
 oper = OperationFactory.createOperate(opt, float(NumA), float(NumB)) 
 print "Restlt: ", oper.GetResult() 
 return 
 
if __name__ == '__main__': 
 clientUI(); 

UML類圖如下:

20163192130485.gif (781×383)

相關(guān)文章

  • 基于python詳解PyScript到底是什么

    基于python詳解PyScript到底是什么

    這篇文章主要介紹了基于python詳解PyScript到底是什么?文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值需要的朋友可以參考一下下面文章內(nèi)容
    2022-06-06
  • Linux下將Python的Django項(xiàng)目部署到Apache服務(wù)器

    Linux下將Python的Django項(xiàng)目部署到Apache服務(wù)器

    這篇文章主要介紹了Python的Django項(xiàng)目部署到Apache服務(wù)器上的要點(diǎn)總結(jié),文中針對的是wsgi連接方式,需要的朋友可以參考下
    2015-12-12
  • 使用Fabric自動(dòng)化部署Django項(xiàng)目的實(shí)現(xiàn)

    使用Fabric自動(dòng)化部署Django項(xiàng)目的實(shí)現(xiàn)

    這篇文章主要介紹了使用Fabric自動(dòng)化部署Django項(xiàng)目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python定時(shí)任務(wù) sched模塊用法實(shí)例

    python定時(shí)任務(wù) sched模塊用法實(shí)例

    這篇文章主要介紹了python定時(shí)任務(wù) sched模塊用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python如何派生內(nèi)置不可變類型并修改實(shí)例化行為

    python如何派生內(nèi)置不可變類型并修改實(shí)例化行為

    這篇文章主要為大家詳細(xì)介紹了python如何派生內(nèi)置不可變類型并修改實(shí)例化行為,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python 數(shù)據(jù)結(jié)構(gòu)之十大經(jīng)典排序算法一文通關(guān)

    Python 數(shù)據(jù)結(jié)構(gòu)之十大經(jīng)典排序算法一文通關(guān)

    排序算法可以分為內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存
    2021-10-10
  • 14個(gè)用Python實(shí)現(xiàn)的Excel常用操作總結(jié)

    14個(gè)用Python實(shí)現(xiàn)的Excel常用操作總結(jié)

    自從學(xué)了Python后就逼迫自己不用Excel,所有操作用Python實(shí)現(xiàn)。目的是鞏固Python,與增強(qiáng)數(shù)據(jù)處理能力。本文為大家總結(jié)了14個(gè)用Python實(shí)現(xiàn)的Excel常用操作,需要的可以參考一下
    2022-06-06
  • Python hashlib模塊實(shí)例使用詳解

    Python hashlib模塊實(shí)例使用詳解

    這篇文章主要介紹了Python hashlib模塊實(shí)例使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Django中使用Whoosh進(jìn)行全文檢索的方法

    Django中使用Whoosh進(jìn)行全文檢索的方法

    這篇文章主要介紹了Django中使用Whoosh進(jìn)行全文檢索的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • python實(shí)現(xiàn)用戶答題功能

    python實(shí)現(xiàn)用戶答題功能

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)用戶答題功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

盱眙县| 廊坊市| 宁蒗| 湘潭县| 满城县| 黑山县| 秦皇岛市| 台州市| 白城市| 吴川市| 衢州市| 南投县| 淳安县| 云安县| 海城市| 濮阳市| 天镇县| 房山区| 甘泉县| 巴青县| 南皮县| 屏东县| 无极县| 祁东县| 揭西县| 长汀县| 永靖县| 扎鲁特旗| 菏泽市| 长宁区| 沙河市| 文水县| 石景山区| 阿拉善右旗| 道孚县| 台山市| 峨眉山市| 和林格尔县| 安陆市| 宁波市| 祁连县|