淺析Python 簡(jiǎn)單工廠模式和工廠方法模式的優(yōu)缺點(diǎn)
前言
在《設(shè)計(jì)模式》一書(shū)中工廠模式提到了:
- 工廠方法模式(Factory Method)
- 抽象工廠模式 (Abstract Factory)
但是在實(shí)際過(guò)程中還有一種工廠模式經(jīng)常被使用,那就是 簡(jiǎn)單工廠模式(Simple Factory)。有一種常見(jiàn)的分類(lèi)的方法:根據(jù)產(chǎn)品是由具體產(chǎn)品還是具體工廠可以分為 工廠方法模式 和 簡(jiǎn)單工廠模式;根據(jù)工廠的抽象程度可以分為 工廠方法模式 和 抽象工廠模式。接下來(lái)會(huì)通過(guò)例子對(duì)比簡(jiǎn)單工廠模式和工廠方法模式。
工廠意圖
定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。Factory Method 使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。
別名
虛構(gòu)造器(Virtual Constructor)
案例
第一階段
小李開(kāi)了一個(gè)代工廠,專門(mén)幫各大廠商生產(chǎn)手機(jī),一開(kāi)始只有小米找他生產(chǎn)小米手機(jī)(MiPhone),后來(lái)質(zhì)量過(guò)硬,聲名遠(yuǎn)播,蘋(píng)果公司也找上門(mén)了,準(zhǔn)備讓他生產(chǎn)蘋(píng)果手機(jī),生意來(lái)了,小李小手一揮,停工幾個(gè)月,加了一個(gè)生產(chǎn)線專門(mén)生成蘋(píng)果手機(jī)(Iphone)。于是乎,現(xiàn)在一個(gè)工廠有兩個(gè)生產(chǎn)線。
第一階段 UML 圖
讓我們借助 UML 圖直觀了解一下工廠現(xiàn)在的樣子。
第一階段代碼
通過(guò)代碼去實(shí)現(xiàn)這個(gè)邏輯
from abc import ABC, abstractmethod # 手機(jī) class Phone(ABC): @abstractmethod def make(self): pass # 蘋(píng)果手機(jī) class Apple(Phone): def make(self): print("make apple") # 小米手機(jī) 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()
看一下運(yùn)行結(jié)果:
make apple
make xiaomi
第二階段
隨著第一階段的訂單完成,現(xiàn)在越來(lái)越多的手機(jī)廠商來(lái)找小李來(lái)生產(chǎn)手機(jī),問(wèn)題來(lái)了,生產(chǎn)線改造需要導(dǎo)致整個(gè)工廠停工一段時(shí)間,每次停工對(duì)工廠來(lái)說(shuō)都是巨大的損失。那么該怎么解決問(wèn)題呢?一個(gè)工廠似乎不夠用了,那么該怎么解決呢? 把所有的生產(chǎn)線獨(dú)立出來(lái)到單獨(dú)的工廠,這樣子需要生產(chǎn)新的手機(jī)只需要新增新的工廠就好了,不會(huì)影響其他的手機(jī)的生產(chǎn)。
第二階段 UML 圖
同樣讓我們借助 UML 圖了解一下這個(gè)階段工廠的樣子吧。
第二階段代碼
同樣讓我們借助代碼去實(shí)現(xiàn)這一階段的邏輯
from abc import ABC, abstractmethod # 抽象工廠 class AbastractFactory(ABC): @abstractmethod def product_phone(self): pass # 蘋(píng)果工廠 class AppleFactory(AbastractFactory): def product_phone(self): return Apple().make() # 小米工廠 class XiaomiFactory(AbastractFactory): def product_phone(self): return XiaoMi().make() # 生產(chǎn)線 class Phone(ABC): @abstractmethod def make(self): pass # 蘋(píng)果生產(chǎn)線 class Apple(Phone): def make(self): print("make apple") # 小米生產(chǎn)線 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()
看一下運(yùn)行結(jié)果:
make xiaomi
make apple
總結(jié)
上面的案例中的倆個(gè)階段分別對(duì)應(yīng)了兩個(gè)設(shè)計(jì)模式,分別是:**簡(jiǎn)單工廠模式 **和 工廠方法模式。通過(guò)案例和對(duì)比,我們不難發(fā)現(xiàn)它們的的優(yōu)缺點(diǎn)。
簡(jiǎn)單工廠模式優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):客戶端與產(chǎn)品的創(chuàng)建分離,客戶端不需要知道產(chǎn)品創(chuàng)建的邏輯,只需要消費(fèi)該產(chǎn)品即可。
- 缺點(diǎn):工廠類(lèi)集成了所有產(chǎn)品的創(chuàng)建邏輯,當(dāng)工廠類(lèi)出現(xiàn)問(wèn)題,所有產(chǎn)品都會(huì)出現(xiàn)問(wèn)題;還有當(dāng)新增加產(chǎn)品都會(huì)修改工廠類(lèi),違背開(kāi)閉原則
工廠方法模式優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):更符合開(kāi)閉原則,增加一個(gè)產(chǎn)品類(lèi),則只需要實(shí)現(xiàn)其他具體的產(chǎn)品類(lèi)和具體的工廠類(lèi)即可;符合單一職責(zé)原則,每個(gè)工廠只負(fù)責(zé)生產(chǎn)對(duì)應(yīng)的產(chǎn)品
- 缺點(diǎn):增加一個(gè)產(chǎn)品,就需要實(shí)現(xiàn)對(duì)應(yīng)的具體工廠類(lèi)和具體產(chǎn)品類(lèi);每個(gè)產(chǎn)品需要有對(duì)應(yīng)的具體工廠和具體產(chǎn)品類(lèi)
以上就是淺析Python 簡(jiǎn)單工廠模式和工廠方法模式的優(yōu)缺點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于Python 工廠模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
django中模板的html自動(dòng)轉(zhuǎn)意方法
今天小編就為大家分享一篇django中模板的html自動(dòng)轉(zhuǎn)意方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Python中分支語(yǔ)句與循環(huán)語(yǔ)句實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Python中分支語(yǔ)句與循環(huán)語(yǔ)句的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09Python的Bottle框架中返回靜態(tài)文件和JSON對(duì)象的方法
這篇文章主要介紹了Python的Bottle框架中返回靜態(tài)文件和JSON對(duì)象的方法,Bottle框架在Python開(kāi)發(fā)者中具有很高的人氣,需要的朋友可以參考下2015-04-04利用Python?Matplotlib繪圖并輸出圖像到文件中的方式
這篇文章主要介紹了利用Python?Matplotlib繪圖并輸出圖像到文件中的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Python通過(guò)for循環(huán)理解迭代器和生成器實(shí)例詳解
這篇文章主要介紹了Python通過(guò)for循環(huán)理解迭代器和生成器,結(jié)合實(shí)例形式詳細(xì)分析了迭代器和生成器的概念、原理、使用方法及相關(guān)操作技巧,需要的朋友可以參考下2019-02-02Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)爬蟲(chóng)
大家好,本篇文章主要講的是Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)爬蟲(chóng),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02Django 拼接兩個(gè)queryset 或是兩個(gè)不可以相加的對(duì)象實(shí)例
這篇文章主要介紹了Django 拼接兩個(gè)queryset 或是兩個(gè)不可以相加的對(duì)象實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03python工具dtreeviz決策樹(shù)可視化和模型可解釋性
這篇文章主要介紹了python工具dtreeviz決策樹(shù)可視化和模型可解釋性,決策樹(shù)是梯度提升機(jī)和隨機(jī)森林的基本構(gòu)建塊,在學(xué)習(xí)這些模型的工作原理和模型可解釋性時(shí),可視化決策樹(shù)是一個(gè)非常有幫助,下文相關(guān)資料,需要的小伙伴可任意參考一下2022-03-03python基礎(chǔ)教程之五種數(shù)據(jù)類(lèi)型詳解
這篇文章主要介紹了python基礎(chǔ)教程之五種數(shù)據(jù)類(lèi)型詳解的相關(guān)資料,這里對(duì)Python 的數(shù)據(jù)類(lèi)型進(jìn)行了詳細(xì)介紹,需要的朋友可以參考下2017-01-01