Python 之簡(jiǎn)單工廠模式

簡(jiǎn)介:簡(jiǎn)單工廠模式(Simple Factory Pattern):又稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。在簡(jiǎn)單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實(shí)例。

模式結(jié)構(gòu)

  • Factory:工廠角色
  • Product:抽象產(chǎn)品角色
  • ConcreateProduct:具體產(chǎn)品角色

特性

? 簡(jiǎn)單工廠模式專門定義一個(gè)類來(lái)負(fù)責(zé)查創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。將對(duì)象的創(chuàng)建和對(duì)象業(yè)務(wù)處理分離可以降低系統(tǒng)的耦合度,使得兩者修改起來(lái)都相對(duì)容易。由于工廠方法是靜態(tài)方法,使用起來(lái)很方便,可通過(guò)類名直接調(diào)用,而且只需要傳入一個(gè)簡(jiǎn)單的參數(shù)即可。簡(jiǎn)單工廠模式的要點(diǎn)在于:當(dāng)你需要什么,只需要傳入正確的參數(shù),就可以獲取你所需要的對(duì)象,而無(wú)須知道其創(chuàng)建細(xì)節(jié)。但是,其最大的問(wèn)題在于工廠類的職責(zé)相對(duì)過(guò)重,增加新的產(chǎn)品需要修改工廠類的判斷邏輯,這一點(diǎn)與開(kāi)閉原則相違背。

優(yōu)點(diǎn)

- 工廠類含有必要的判斷邏輯,客戶端無(wú)需知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體長(zhǎng)跑類所對(duì)應(yīng)的參數(shù)即可,減少使用者的記憶量。
- 通過(guò)引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,一定程度上提高了系統(tǒng)的靈活性。

缺點(diǎn)

- 由于工廠類集中了所有產(chǎn)品創(chuàng)建邏輯,一旦不能正常工作,整個(gè)系統(tǒng)都要受到影響。
- 簡(jiǎn)單工廠模式將會(huì)增加系統(tǒng)中類的個(gè)數(shù),在一定程度上增加了系統(tǒng)的復(fù)雜度和理解難度。
- 系統(tǒng)擴(kuò)展難,一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時(shí),有可能造成工廠邏輯過(guò)于復(fù)雜,不利于系統(tǒng)的擴(kuò)展和維護(hù)。
- 簡(jiǎn)單工廠模式猶豫使用了靜態(tài)工廠方法,造成工廠角色無(wú)法形成基于繼承的登記結(jié)構(gòu)

應(yīng)用場(chǎng)景

  • 工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少:由于創(chuàng)建的對(duì)象較少,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯過(guò)于復(fù)雜。
  • 客戶端只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象不關(guān)心。

代碼示例

現(xiàn)在有一個(gè)工人,他的工作是砍樹(shù),工具為花崗巖石斧和鐵斧,不同的環(huán)境:現(xiàn)代社會(huì)與原始社會(huì)。

class Person(object):
  def __init__(self,name):
    self.name = name
  def work(self):
    
    axe1 = StoneAxe("花崗巖石斧")
    axe2 = SteelAxe("鐵斧頭")
    axe1.cutTree()
    axe2.cutTree()
    
class Axe(object):
  def __init__(self,name):
    self.name = name
  def cutTree(self):
    print("%s斧頭砍樹(shù)"%self.name)

class StoneAxe(Axe):
     def cutTree(self):
         print("使用%s開(kāi)始砍樹(shù)"%self.name)
class SteelAxe(Axe):
     def cutTree(self):
         print("使用%s開(kāi)始砍樹(shù)"%self.name)  
p1 = Person("lili")
p1.work()

以上代碼的問(wèn)題:

- 直接在work下創(chuàng)建斧頭
- 人與斧頭的耦合性強(qiáng),相當(dāng)于現(xiàn)在我們需要自己根據(jù)不同的需求去創(chuàng)建不同的斧頭
- 我們使用不同的斧頭需要修改work下的代碼
- 依賴性太強(qiáng)

解決問(wèn)題:

class Axe(object):
  def __init__(self,name):
    self.name = name
  def cutTree(self):
    print("%s斧頭砍樹(shù)"%self.name)

class StoneAxe(Axe):
  def cutTree(self):
    print("%s斧頭開(kāi)始砍樹(shù)"%self.name)
    
class SteelAxe(Axe):
  def cutTree(self):
    print("%s斧頭開(kāi)始砍樹(shù)"%self.name)
    
    
class Factory(object):
  @staticmethod
  def createAxe(type):
    if type == "Stone":
      axe = StoneAxe("花崗巖斧頭")
      return axe
    elif type == "Steel":
      axe = SteelAxe("鐵斧頭")
      return axe
    else:
      print("輸入類型錯(cuò)誤,沒(méi)有此類型的斧頭")
 

class Person(object):
  def __init__(self,name):
    self.name = name
  def work(self,axe,type):
    axe = Factory.createAxe(type)
    axe.cutTree()
    
    
p1 = Person("lilei")
p1.work()

總結(jié)

簡(jiǎn)單工廠模式的要點(diǎn)在于:當(dāng)你需要什么,只需要傳入正確的參數(shù),就能得到你所需要的對(duì)象,而無(wú)須知道其創(chuàng)建的細(xì)節(jié)。其最大的優(yōu)點(diǎn)在于實(shí)現(xiàn)對(duì)象創(chuàng)建和對(duì)象使用分離,將對(duì)象的創(chuàng)建交給專門的工廠類負(fù)責(zé)。但是其最大的缺點(diǎn)增加新的具體產(chǎn)品需要修改工廠類的業(yè)務(wù)判斷邏輯,而且產(chǎn)品較多時(shí),工廠類方法過(guò)于復(fù)雜。

每天多努力那么一點(diǎn)點(diǎn),積少成多

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 工廠模式是我們最常用的實(shí)例化對(duì)象模式了,是用工廠方法代替new操作的一種模式。通常我們所說(shuō)的工廠模式是指工廠方法模...
    zfylin閱讀 1,403評(píng)論 0 7
  • 一個(gè)UML類圖 類之間的關(guān)系 類的繼承結(jié)構(gòu)表現(xiàn)在UML中為:泛化(generalize)與實(shí)現(xiàn)(realize) ...
    僚機(jī)KK閱讀 750評(píng)論 0 0
  • 二十三種設(shè)計(jì)模式 - 簡(jiǎn)單工廠模式 簡(jiǎn)單工廠模式簡(jiǎn)介 模式動(dòng)機(jī) 考慮一個(gè)簡(jiǎn)單的軟件應(yīng)用場(chǎng)景,一個(gè)軟件系統(tǒng)可以提供多...
    JustTheSame閱讀 659評(píng)論 0 2
  • 1.接口基礎(chǔ)回顧 設(shè)計(jì)模式六大原則,其中依賴倒轉(zhuǎn)原則,強(qiáng)調(diào)我們應(yīng)該面向接口編程,那什么是接口?接口的作用? 接口如...
    孟婆湯不解渴閱讀 904評(píng)論 0 3
  • “人之初,性本善”其實(shí)是一個(gè)美好的愿望,渴望且祝愿人性善良的一面被重視,受弘揚(yáng)。實(shí)際上人與生俱來(lái)都帶有獸性,只是在...
    梅花瓣閱讀 189評(píng)論 0 0

友情鏈接更多精彩內(nèi)容