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

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

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

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

20163295917069.png (603×257)

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

拿一個動物工廠來舉例說明

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('魚骨頭')

下面是簡單工廠模式的實現(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('魚骨頭')

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

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

相關(guān)文章

  • 關(guān)于Python調(diào)用百度語音合成SDK實現(xiàn)文字轉(zhuǎn)音頻的方法

    關(guān)于Python調(diào)用百度語音合成SDK實現(xiàn)文字轉(zhuǎn)音頻的方法

    這篇文章主要介紹了關(guān)于Python調(diào)用百度語音合成SDK實現(xiàn)文字轉(zhuǎn)音頻的方法,AipSpeech是語音合成的Python?SDK客戶端,為使用語音合成的開發(fā)人員提供了一系列的交互方法,需要的朋友可以參考下
    2023-07-07
  • python爬蟲智能翻頁批量下載文件的實例詳解

    python爬蟲智能翻頁批量下載文件的實例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲智能翻頁批量下載文件的實例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • 基于python的七種經(jīng)典排序算法(推薦)

    基于python的七種經(jīng)典排序算法(推薦)

    本篇文章主要介紹基于python的七種經(jīng)典排序算法(推薦),具有一定的參考價值,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。
    2016-12-12
  • Python數(shù)學(xué)建模PuLP庫線性規(guī)劃進(jìn)階基于字典詳解

    Python數(shù)學(xué)建模PuLP庫線性規(guī)劃進(jìn)階基于字典詳解

    在大規(guī)模的規(guī)劃問題中,這樣逐個定義變量和設(shè)置模型參數(shù)非常繁瑣,效率很低。Pulp 庫提供了一種快捷方式,可以結(jié)合 Python語言的循環(huán)和容器,使用字典來創(chuàng)建問題
    2021-10-10
  • Python第三方庫的安裝方法總結(jié)

    Python第三方庫的安裝方法總結(jié)

    庫library是一個泛稱,一般值作為文件形式存在的模塊以及以文件夾形式存在的包的合成,這里作了Python第三方庫的安裝方法總結(jié),包括源碼安裝、包管理器安裝以及虛擬環(huán)境相關(guān)安裝三種方式的講解
    2016-06-06
  • Python繪制驚艷的?;鶊D的示例詳解

    Python繪制驚艷的?;鶊D的示例詳解

    很多時候,我們需要一種必須可視化數(shù)據(jù)如何在實體之間流動的情況。這個時候就需要?;鶊D,它通常描繪 從一個實體(或節(jié)點(diǎn))到另一個實體(或節(jié)點(diǎn))的數(shù)據(jù)流。本文將利用Python繪制驚艷的桑基圖,需要的可以參考一下
    2022-02-02
  • 對python添加模塊路徑的三種方法總結(jié)

    對python添加模塊路徑的三種方法總結(jié)

    今天小編就為大家分享一篇對python添加模塊路徑的三種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python BeautifulSoup庫的常用操作

    python BeautifulSoup庫的常用操作

    Beautiful Soup 是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫,它能夠通過你喜歡的轉(zhuǎn)換器實現(xiàn)慣用的文檔導(dǎo)航,查詢,修改文檔的方式,本文就來給大家簡單介紹一下BeautifulSoup庫的常用操作,需要的朋友可以參考下
    2023-08-08
  • Python 描述符(Descriptor)入門

    Python 描述符(Descriptor)入門

    本文給大家介紹的是Python中比較重要的一個知識點(diǎn)--描述符(Descriptor),描述符(descriptor)是Python語言核心中困擾我時間最長的一個特性,但是一旦你理解了之后,描述符的確還是有它的應(yīng)用價值的。
    2016-11-11
  • Python調(diào)用DeepSeek?API的完整操作指南

    Python調(diào)用DeepSeek?API的完整操作指南

    本文將詳細(xì)介紹如何使用?Python?調(diào)用?DeepSeek?API,實現(xiàn)流式對話并保存對話記錄,相比?Go?版本,Python?實現(xiàn)更加簡潔優(yōu)雅,適合快速開發(fā)和原型驗證,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2025-02-02

最新評論

罗甸县| 奈曼旗| 元谋县| 金溪县| 六枝特区| 双牌县| 蓬安县| 手游| 峨边| 汕头市| 虹口区| 修文县| 高密市| 太保市| 明光市| 平顶山市| 东阳市| 介休市| 大同市| 射阳县| 黑龙江省| 江山市| 旌德县| 双辽市| 永安市| 崇仁县| 巨鹿县| 宽甸| 华坪县| 孝感市| 襄城县| 仪征市| 龙井市| 山丹县| 华坪县| 乌恰县| 丰顺县| 修文县| 碌曲县| 葫芦岛市| 焦作市|