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

詳解設(shè)計(jì)模式中的工廠方法模式在Python程序中的運(yùn)用

 更新時(shí)間:2016年03月02日 10:01:36   作者:Blue Wish  
這篇文章主要介紹了設(shè)計(jì)模式中的工廠方法模式在Python程序中的運(yùn)用,工廠方法模式主張程序在設(shè)計(jì)時(shí)要可以根據(jù)不同的條件生成各種類的實(shí)例,需要的朋友可以參考下

工廠方法(Factory Method)模式又稱為虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式,屬于類的創(chuàng)建型模式。在工廠方法模式中,父類負(fù)責(zé)定義創(chuàng)建對(duì)象的公共接口,而子類則負(fù)責(zé)生成具體的對(duì)象,這樣做的目的是將類的實(shí)例化操作延遲到子類中完成,即由子類來(lái)決定究竟應(yīng)該實(shí)體化哪一個(gè)類。
在簡(jiǎn)單工廠模式中,一個(gè)工廠類處于對(duì)產(chǎn)品類進(jìn)行實(shí)例化的中心位置上,它知道每一個(gè)產(chǎn)品類的細(xì)節(jié),并決定何時(shí)哪一個(gè)產(chǎn)品類應(yīng)當(dāng)被實(shí)例化。簡(jiǎn)單工廠模式的優(yōu)點(diǎn)是能夠使客戶端獨(dú)立于產(chǎn)品的創(chuàng)建過(guò)程,并且在系統(tǒng)中引入新產(chǎn)品時(shí)無(wú)需對(duì)客戶端進(jìn)行修改,缺點(diǎn)是當(dāng)有新產(chǎn)品要加入到系統(tǒng)中時(shí),必須對(duì)工廠類進(jìn)行修改,以加入必要的處理邏輯。簡(jiǎn)單工廠模式的致命弱點(diǎn)就是處于核心地位的工廠類,因?yàn)橐坏┧鼰o(wú)法確定要對(duì)哪個(gè)類進(jìn)行實(shí)例化時(shí),就無(wú)法使用該模式,而工廠方法模式則可以很好地避免這一問(wèn)題。
考慮這樣一個(gè)應(yīng)用程序框架(Framework),它可以用來(lái)瀏覽各種格式的文檔,如TXT、DOC、PDF、HTML等,設(shè)計(jì)時(shí)為了讓軟件的體系結(jié)構(gòu)能夠盡可能地通用,定義了Application和Document這兩個(gè)抽象父類,客戶必須通過(guò)它們的子類來(lái)處理某一具體類型的文檔。例如,要想利用該框架來(lái)編寫(xiě)一個(gè)PDF文件瀏覽器,必須先定義PDFApplication和PDFDocument這兩個(gè)類,它們應(yīng)該分別繼承于Application和Document。
Application的職責(zé)是對(duì)Document進(jìn)行管理,并且在需要時(shí)創(chuàng)建它們,比如當(dāng)用戶從菜單中選擇Open或者New的時(shí)候,Application就要負(fù)責(zé)創(chuàng)建一個(gè)Document的實(shí)例。顯而易見(jiàn),被實(shí)例化的特定Document子類是與具體應(yīng)用相關(guān)的,因此Application無(wú)法預(yù)測(cè)哪個(gè)Document的子類將被實(shí)例化,它只知道一個(gè)新的Document何時(shí)(When)被創(chuàng)建,但并不知道哪種(Which)具體的Document將被創(chuàng)建。此時(shí)若仍堅(jiān)持使用簡(jiǎn)單工廠模式會(huì)出現(xiàn)一個(gè)非常尷尬的局面:框架必須實(shí)例化類,但它只知道不能被實(shí)例化的抽象類。
解決的辦法是使用工廠方法模式,它封裝了哪一個(gè)Document子類將被創(chuàng)建的信息,并且能夠?qū)⑦@些信息從框架中分離出來(lái)。如圖1所示,Application的子類重新定義了Application的抽象方法createDocument(),并返回某個(gè)恰當(dāng)?shù)腄ocument子類的實(shí)例。我們稱createDocument()是一個(gè)工廠方法(factory method),因?yàn)樗浅P蜗蟮孛枋隽祟惖膶?shí)例化過(guò)程,即負(fù)責(zé)"生產(chǎn)"一個(gè)對(duì)象。

20163295917069.png (603×257)

簡(jiǎn)單說(shuō)來(lái),工廠方法模式的作用就是可以根據(jù)不同的條件生成各種類的實(shí)例,這些實(shí)例通常屬于多個(gè)相似的類型,并且具有共同的父類。工廠方法模式將這些實(shí)例的創(chuàng)建過(guò)程封裝了起來(lái),從而簡(jiǎn)化了客戶程序的編寫(xiě),并改善了軟件體系結(jié)構(gòu)的可擴(kuò)展性,使得將來(lái)能夠以最小的代價(jià)加入新的子類。工廠方法這一模式適合在如下場(chǎng)合中運(yùn)用:
當(dāng)無(wú)法得知必須創(chuàng)建的對(duì)象屬于哪個(gè)類的時(shí)候,或者無(wú)法得知屬于哪個(gè)類的對(duì)象將被返回的時(shí)候,但前提是這些對(duì)象都符合一定的接口標(biāo)準(zhǔn)。
當(dāng)一個(gè)類希望由它的子類來(lái)決定所創(chuàng)建的對(duì)象的時(shí)候,其目的是使程序的可擴(kuò)展性更好,在加入其他類時(shí)更具彈性。
當(dāng)創(chuàng)建對(duì)象的職責(zé)被委托給多個(gè)幫助子類(helper subclass)中的某一個(gè),并且希望將哪個(gè)子類是代理者這一信息局部化的時(shí)候。
需要說(shuō)明的是,使用工廠方法模式創(chuàng)建對(duì)象并不意味著一定會(huì)讓代碼變得更短(實(shí)事上往往更長(zhǎng)),并且可能需要設(shè)計(jì)更多的輔助類,但它的確可以靈活地、有彈性地創(chuàng)建尚未確定的對(duì)象,從而簡(jiǎn)化了客戶端應(yīng)用程序的邏輯結(jié)構(gòu),并提高了代碼的可讀性和可重用性。

拿一個(gè)動(dòng)物工廠來(lái)舉例說(shuō)明

class Animal(object):
  def eat(self, food):
    raise NotImplementedError()

class Dog(Animal):
  def eat(self, food):
    print '狗吃', food

class Cat(Animal):
  def eat(self, food):
    print '貓吃', food

class AnimalFactory(object):
  def create_animal(self):
    raise NotImplementedError()

class DogFactory(Animal):
  def create_animal(self):
    return Dog()

class CatFactory(AnimalFactory):
  def create_animal(self):
    return Cat()

def client():
  animal_factory = DogFactory()
  animal = animal_factory.create_animal()
  animal.eat('肉骨頭')

  animal_factory = CatFactory()
  animal = animal_factory.create_animal()
  animal.eat('魚(yú)骨頭')

下面是簡(jiǎn)單工廠模式的實(shí)現(xiàn):

class Animal(object):
  def eat(self, food):
    raise NotImplementedError()

class Dog(Animal):
  def eat(self, food):
    print '狗吃', food

class Cat(Animal):
  def eat(self, food):
    print '貓吃', food

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

def client():
  animal = create_animal('dog')
  animal.eat('肉骨頭')
  animal = create_animal('cat')
  animal.eat('魚(yú)骨頭')

看起來(lái)工廠方法模式要復(fù)雜很多啊,也沒(méi)覺(jué)得比簡(jiǎn)單工廠模式有什么好處,為什么還要用工廠方法模式呢? 簡(jiǎn)單工廠模式的優(yōu)點(diǎn)很明顯,工廠函數(shù)封裝了邏輯判斷,客戶端使用負(fù)擔(dān)要小很多。相應(yīng)的問(wèn)題也很明顯,要增加新的產(chǎn)品類型,就需要修改工廠函數(shù),這違背了開(kāi)閉原則。 但是工廠方法模式似乎繞了一圈又回到原始時(shí)代了,下面寫(xiě)不就行了嗎,何必外面套一層Factory:

class Animal(object):
  def eat(self, food):
    raise NotImplementedError()

class Dog(Animal):
  def eat(self, food):
    print '狗吃', food

class Cat(Animal):
  def eat(self, food):
    print '貓吃', food
def client():
  dog = Dog()
  dog.eat('肉骨頭')

  cat = Cat()
  cat.eat('魚(yú)骨頭')

工廠方法模式,對(duì)于需要做強(qiáng)類型檢查的語(yǔ)言比如Java、C++等在組織代碼時(shí)是有好處的。對(duì)于Python這種動(dòng)態(tài)語(yǔ)言來(lái)說(shuō),感覺(jué)體現(xiàn)不出太多價(jià)值,或許我還沒(méi)有理解工廠方法模式的真諦。

相關(guān)文章

  • Python工程師面試題 與Python Web相關(guān)

    Python工程師面試題 與Python Web相關(guān)

    這篇文章主要為大家分享了Python工程師面試題,面試題的內(nèi)容主要與Python Web相關(guān),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 常見(jiàn)的python正則用法實(shí)例講解

    常見(jiàn)的python正則用法實(shí)例講解

    這篇文章為大家詳細(xì)主要介紹了常見(jiàn)的python正則用法實(shí)例,列舉Python正則表達(dá)式的幾種匹配用法,感興趣的小伙伴們可以參考一下
    2016-06-06
  • python編寫(xiě)函數(shù)注意事項(xiàng)總結(jié)

    python編寫(xiě)函數(shù)注意事項(xiàng)總結(jié)

    在本篇文章里小編給大家分享了一篇關(guān)于python編寫(xiě)函數(shù)注意事項(xiàng)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • Python中if elif else及縮進(jìn)的使用簡(jiǎn)述

    Python中if elif else及縮進(jìn)的使用簡(jiǎn)述

    這篇文章主要介紹了Python中if elif else及縮進(jìn)的使用,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • numpy.reshape(-1,1)的具體使用

    numpy.reshape(-1,1)的具體使用

    本文主要介紹了numpy.reshape(-1,1)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Python3安裝tensorflow及配置過(guò)程

    Python3安裝tensorflow及配置過(guò)程

    TensorFlow 是一個(gè)端到端開(kāi)源機(jī)器學(xué)習(xí)平臺(tái),能夠幫助開(kāi)發(fā)者快速輕松的構(gòu)建和部署由機(jī)器學(xué)習(xí)提供應(yīng)用,對(duì)Python3安裝tensorflow的相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)下吧
    2021-05-05
  • numpy 返回函數(shù)的上三角矩陣實(shí)例

    numpy 返回函數(shù)的上三角矩陣實(shí)例

    今天小編就為大家分享一篇numpy 返回函數(shù)的上三角矩陣實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Python基礎(chǔ)學(xué)習(xí)函數(shù)+模塊+類

    Python基礎(chǔ)學(xué)習(xí)函數(shù)+模塊+類

    這篇文章主要介紹了Python基礎(chǔ)學(xué)習(xí)函數(shù)+模塊+類,這是基礎(chǔ)學(xué)習(xí)的第三篇內(nèi)容,小編已把前兩篇鏈接放在下面,需要學(xué)習(xí)的同學(xué)可以參考一下
    2022-05-05
  • 解決python web項(xiàng)目意外關(guān)閉,但占用端口的問(wèn)題

    解決python web項(xiàng)目意外關(guān)閉,但占用端口的問(wèn)題

    今天小編就為大家分享一篇解決python web項(xiàng)目意外關(guān)閉,但占用端口的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 使用Python進(jìn)行數(shù)據(jù)可視化實(shí)現(xiàn)引人注目的視覺(jué)效果

    使用Python進(jìn)行數(shù)據(jù)可視化實(shí)現(xiàn)引人注目的視覺(jué)效果

    這篇文章主要介紹了使用Python進(jìn)行數(shù)據(jù)可視化實(shí)現(xiàn)引人注目的視覺(jué)效果,您將了解基本的數(shù)據(jù)可視化概念,以及如何創(chuàng)建各種引人注目的圖表和圖形,從而更好地理解和呈現(xiàn)數(shù)據(jù)
    2023-04-04

最新評(píng)論