1. 程式人生 > 實用技巧 >【Python篇】工廠模式

【Python篇】工廠模式

工廠方法模式

前言

在《設計模式》一書中工廠模式提到了:

  • 工廠方法模式(Factory Method)
  • 抽象工廠模式 (Abstract Factory)

但是在實際過程中還有一種工廠模式經常被使用,那就是 簡單工廠模式(Simple Factory)。有一種常見的分類的方法:根據產品是由具體產品還是具體工廠可以分為 工廠方法模式簡單工廠模式;根據工廠的抽象程度可以分為 工廠方法模式抽象工廠模式。接下來會通過例子對比簡單工廠模式和工廠方法模式。

工廠意圖

定義一個用於建立物件的介面,讓子類決定例項化哪一個類。Factory Method 使一個類的例項化延遲到其子類。

別名

虛構造器(Virtual Constructor)

案例

第一階段

小李開了一個代工廠,專門幫各大廠商生產手機,一開始只有小米找他生產小米手機(MiPhone),後來質量過硬,聲名遠播,蘋果公司也找上門了,準備讓他生產蘋果手機,生意來了,小李小手一揮,停工幾個月,加了一個生產線專門生成蘋果手機(Iphone)。於是乎,現在一個工廠有兩個生產線。

第一階段 UML 圖

讓我們藉助 UML 圖直觀瞭解一下工廠現在的樣子。

第一階段程式碼

通過程式碼去實現這個邏輯

from abc import ABC, abstractmethod

# 手機
class Phone(ABC): @abstractmethod
def make(self):
pass # 蘋果手機
class Apple(Phone): def make(self):
print("make apple") # 小米手機
class XiaoMi(Phone): def make(self):
print("make xiaomi") class Factory: def product_phone(self, mobile_type):
if mobile_type == 'apple':
return Apple()
else:
return XiaoMi() if __name__ == '__main__':
factory = Factory()
factory.product_phone('apple').make()
factory.product_phone('xiaomi').make()

看一下執行結果:

make apple
make xiaomi

第二階段

隨著第一階段的訂單完成,現在越來越多的手機廠商來找小李來生產手機,問題來了,生產線改造需要導致整個工廠停工一段時間,每次停工對工廠來說都是巨大的損失。那麼該怎麼解決問題呢?一個工廠似乎不夠用了,那麼該怎麼解決呢? 把所有的生產線獨立出來到單獨的工廠,這樣子需要生產新的手機只需要新增新的工廠就好了,不會影響其他的手機的生產。

第二階段 UML 圖

同樣讓我們藉助 UML 圖瞭解一下這個階段工廠的樣子吧。

第二階段程式碼

同樣讓我們藉助程式碼去實現這一階段的邏輯

from abc import ABC, abstractmethod

# 抽象工廠
class AbastractFactory(ABC): @abstractmethod
def product_phone(self):
pass # 蘋果工廠
class AppleFactory(AbastractFactory): def product_phone(self):
return Apple().make() # 小米工廠
class XiaomiFactory(AbastractFactory): def product_phone(self):
return XiaoMi().make() # 生產線
class Phone(ABC): @abstractmethod
def make(self):
pass # 蘋果生產線
class Apple(Phone): def make(self):
print("make apple") # 小米生產線
class XiaoMi(Phone): def make(self):
print("make xiaomi") def client_product(factory:AbastractFactory):
return factory if __name__ == '__main__':
xiaomi = client_product(XiaomiFactory())
xiaomi.product_phone()
apple = client_product(AppleFactory())
apple.product_phone()

看一下執行結果:

make xiaomi
make apple

總結

上面的案例中的倆個階段分別對應了兩個設計模式,分別是:**簡單工廠模式 **和 工廠方法模式。通過案例和對比,我們不難發現它們的的優缺點。

簡單工廠模式優缺點

  • 優點:客戶端與產品的建立分離,客戶端不需要知道產品建立的邏輯,只需要消費該產品即可。
  • 缺點:工廠類集成了所有產品的建立邏輯,當工廠類出現問題,所有產品都會出現問題;還有當新增加產品都會修改工廠類,違背開閉原則

工廠方法模式優缺點

  • 優點:更符合開閉原則,增加一個產品類,則只需要實現其他具體的產品類和具體的工廠類即可;符合單一職責原則,每個工廠只負責生產對應的產品
  • 缺點:增加一個產品,就需要實現對應的具體工廠類和具體產品類;每個產品需要有對應的具體工廠和具體產品類