淺析Python 抽象工廠模式的優(yōu)缺點(diǎn)
前言
接著上一篇的故事工廠模式繼續(xù),手機(jī)要出廠,顯然光一個(gè)手機(jī)肯定是不行的,還需要包裝盒、充電器等等東西。我們按照上一篇提到的工廠模式,去建立新的工廠是一點(diǎn)都沒(méi)有問(wèn)題的。但是思考一下這樣子做會(huì)帶來(lái)的問(wèn)題,顯然工廠太多了,將包裝盒、充電器全部分散到各個(gè)工廠,組裝什么的也是一個(gè)大問(wèn)題,那么有沒(méi)有更好的辦法呢?答案是肯定的,抽象工廠模式。
抽象工廠意圖
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需制定它們具體的累。
別名
Kit
案例
第三階段
光生產(chǎn)手機(jī)遠(yuǎn)遠(yuǎn)不夠,還需要生產(chǎn)其他配件,分散到新的工廠成本太高,也不利于維護(hù),那就把一個(gè)類型的手機(jī)所需要的所有東西,都放到一個(gè)工廠完成,小米工廠生產(chǎn)小米手機(jī)以及小米手機(jī)配套的東西,蘋果手機(jī)生產(chǎn)蘋果手機(jī)以及蘋果手機(jī)配套的東西,客戶只需要關(guān)心要什么手機(jī)就行了。
第三階段 UML 圖
讓我們借助 UML 圖直觀了解一下這個(gè)時(shí)候工廠的樣子

第三階段代碼
通過(guò)代碼去實(shí)現(xiàn)這個(gè)邏輯
from abc import ABC, abstractmethod
# 抽象手機(jī)
class AbstractMobile(ABC):
@abstractmethod
def make(self):
pass
class XiaoMiMobile(AbstractMobile):
def make(self):
print("make xiaomi mobile")
class AppleMobile(AbstractMobile):
def make(self):
print("make apple mobile")
# 抽象手機(jī)配件
class AbstractOthers(ABC):
@abstractmethod
def make(self):
pass
class XiaoMiOthers(AbstractMobile):
def make(self):
print("make xiaomi others")
class AppleOthers(AbstractMobile):
def make(self):
print("make apple others")
# 抽象工廠
class AbstractFactory(ABC):
@abstractmethod
def create_mobile(self) -> AbstractMobile:
pass
@abstractmethod
def create_others(self) -> AbstractOthers:
pass
class XiaoMiFactory(AbstractFactory):
def create_mobile(self) -> XiaoMiMobile:
return XiaoMiMobile().make()
def create_others(self) -> XiaoMiOthers:
return XiaoMiOthers().make()
class AppleFactory(AbstractFactory):
def create_mobile(self) -> AppleMobile:
return AppleMobile().make()
def create_others(self) -> AppleOthers:
return AppleOthers().make()
def client(factory: AbstractFactory) -> None:
product_mobile = factory.create_mobile()
product_others = factory.create_others()
if __name__ == "__main__":
client(XiaoMiFactory())
client(AppleFactory())
看一下運(yùn)行結(jié)果:
make xiaomi mobile
make xiaomi others
make apple mobile
make apple others
總結(jié)
如果代碼需要與多個(gè)不同系列的相關(guān)產(chǎn)品交互, 但是由于無(wú)法提前獲取相關(guān)信息, 或者出于對(duì)未來(lái)擴(kuò)展性的考慮, 你不希望代碼基于產(chǎn)品的具體類進(jìn)行構(gòu)建, 在這種情況下, 你可以使用抽象工廠。
在設(shè)計(jì)良好的程序中, 每個(gè)類僅負(fù)責(zé)一件事。 如果一個(gè)類與多種類型產(chǎn)品交互, 就可以考慮將工廠方法抽取到獨(dú)立的工廠類或具備完整功能的抽象工廠類中。
抽象工廠的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 你可以確保同一工廠生成的產(chǎn)品相互匹配。
- 你可以避免客戶端和具體產(chǎn)品代碼的耦合。
- 單一職責(zé)原則。 你可以將產(chǎn)品生成代碼抽取到同一位置, 使得代碼易于維護(hù)。
- 開閉原則。 向應(yīng)用程序中引入新產(chǎn)品變體時(shí), 你無(wú)需修改客戶端代碼
缺點(diǎn)
- 由于采用該模式需要向應(yīng)用中引入眾多接口和類, 代碼可能會(huì)比之前更加復(fù)雜,即產(chǎn)品族擴(kuò)展非常困難
以上就是淺析Python 抽象工廠模式的優(yōu)缺點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于Python 抽象工廠模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python爬蟲實(shí)戰(zhàn)之批量下載快手平臺(tái)視頻數(shù)據(jù)
讀萬(wàn)卷書不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你批量下載快手平臺(tái)視頻數(shù)據(jù),大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10
在keras 中獲取張量 tensor 的維度大小實(shí)例
這篇文章主要介紹了在keras 中獲取張量 tensor 的維度大小實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python協(xié)程asyncio模塊的演變及高級(jí)用法
網(wǎng)上很多關(guān)于Python協(xié)程asyncio模塊的教程都是基于老版Python的, 本文將以對(duì)比方式展示新老Python版本下協(xié)程的寫法有什么不同并總結(jié)了asyncio的一些高級(jí)用法, 包括如何獲取協(xié)程任務(wù)執(zhí)行結(jié)果,gather和wait方法的區(qū)別以及如何給任務(wù)添加回調(diào)函數(shù)。2021-05-05
Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的MySQL類
這篇文章主要介紹了Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的MySQL類,可實(shí)現(xiàn)基本的初始化連接及查詢、刪除等功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
python實(shí)現(xiàn)獲取電腦所連接的wifi密碼
電腦連接wifi后,很難直觀地看到當(dāng)前連接wifi的密碼,需要借助命令行公管局才可以查看到相關(guān)信息,本文為大家介紹一下如何利用python獲取電腦所連接的wifi密碼,感興趣的可以了解下2023-11-11

