欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python設(shè)計(jì)模式中的創(chuàng)建型工廠模式

 更新時(shí)間:2022年02月15日 09:04:00   作者:范桂颶  
這篇文章主要介紹了Python設(shè)計(jì)模式中的創(chuàng)建型工廠模式,工廠模式即Factory?Pattern,是提供創(chuàng)建對(duì)象的最佳方式,下文小編介紹Python工廠模式的相關(guān)資料,需要的朋友可以參考一下

一、工廠模式(Factory Pattern)

工廠模式(Factory Pattern),提供了一種實(shí)例化(創(chuàng)建)對(duì)象的最佳方式。

在工廠模式中,首先定義了一個(gè)抽象的工廠類(lèi)(class Factory),并且在該工廠類(lèi)中定義了提供了一個(gè)通用的、用于實(shí)例化對(duì)象的 Interface(接口)函數(shù)。然后當(dāng) Client 想要實(shí)例化某個(gè)具體的類(lèi)的對(duì)象時(shí),只需要將需求告訴工廠類(lèi)即可,由工廠類(lèi)按需求去完成對(duì)象的實(shí)例化并返回。而 Client 作為調(diào)用者,則無(wú)需知道對(duì)象實(shí)例化的任何細(xì)節(jié),這意味著任意的 Client 都無(wú)需要考慮根據(jù)對(duì)象的實(shí)例化細(xì)節(jié)來(lái)調(diào)整自身的代碼。

例如:當(dāng)我們需要購(gòu)買(mǎi)一批電腦,只要把我們的需求告訴電腦工廠,電腦工廠就會(huì)幫我們把這批電腦做好,而不用我們自己去做這個(gè)電腦的,也不用我們自己去知道這個(gè)電腦是怎么做出來(lái)的,這就是工廠模式。

工廠模式帶來(lái)的好處就是幫助我們把對(duì)象的實(shí)例化部分抽取了出來(lái),目的是降低系統(tǒng)中代碼耦合度,并且增強(qiáng)了系統(tǒng)的擴(kuò)展性。是一種解耦思想的實(shí)踐。

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

  • Multi-Drivers(多驅(qū)動(dòng)架構(gòu))

三、編碼示例

1、簡(jiǎn)單工廠模式

簡(jiǎn)單工廠模式,只是做了一層簡(jiǎn)單的封裝,將不同對(duì)象的實(shí)例化操作都單獨(dú)放到了一個(gè)工廠類(lèi)中。

當(dāng)我們需要實(shí)例化某個(gè)對(duì)象時(shí),只需把我們的需求告訴簡(jiǎn)單工廠類(lèi),然后由這個(gè)簡(jiǎn)單工廠類(lèi)根據(jù)我們的需求去創(chuàng)建對(duì)應(yīng)的對(duì)象即可。適用于簡(jiǎn)單的業(yè)務(wù)場(chǎng)景。

優(yōu)點(diǎn): 簡(jiǎn)單工廠模式可以根據(jù)需求,動(dòng)態(tài)生成使用者所需類(lèi)的對(duì)象,而使用者不用去知道怎么創(chuàng)建對(duì)象,使得各個(gè)模塊各司其職,降低了系統(tǒng)的耦合性。

缺點(diǎn): 擴(kuò)展性差,違背了開(kāi)閉原則(開(kāi)閉原則指的是:軟件實(shí)現(xiàn)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉)。新增產(chǎn)品時(shí),需要修改簡(jiǎn)單工廠類(lèi)的代碼。

實(shí)體角色:

  • 產(chǎn)品的抽象類(lèi)
  • 具體的產(chǎn)品子類(lèi)
  • 簡(jiǎn)單工廠類(lèi)
import abc

# 產(chǎn)品的抽象類(lèi)
class Productor(metaclass=abc.ABCMeta):

? ? @abc.abstractmethod
? ? def product(self, car):
? ? ? ? pass
? ? ? ??
# 更具體的某個(gè)產(chǎn)品類(lèi),是產(chǎn)品抽象類(lèi)的子類(lèi)
class Xiaomi(Productor):
? ? """
? ? 小米手機(jī)
? ? """
? ? def product(self, price):
? ? ? ? return f"制造一部小米手機(jī),售價(jià){price}元"
? ? ? ??
? ? def __repr__(self):
? ? ? ? return f"Xiaomi,{id(self)}"?
? ??
# 更具體的某個(gè)產(chǎn)品類(lèi),是產(chǎn)品抽象類(lèi)的子類(lèi)
class Huawei(Productor):
? ? """
? ? 華為手機(jī)
? ? """
? ? def product(self, price):
? ? ? ? return f"制造一部華為手機(jī),售價(jià){price}元"
? ? ? ??
? ? def __repr__(self):
? ? ? ? return f"Huawei,{id(self)}"?
? ??
# 簡(jiǎn)單工廠類(lèi)
class PhoneBrandFactory:
? ? """
? ? 簡(jiǎn)單工廠
? ? """
? ? def create_productor(self, brand):
? ? ? ? if brand == "Xiaomi":
? ? ? ? ? ? return Xiaomi()
? ? ? ? if brand == "Huawei":
? ? ? ? ? ? return Huawei()
? ? ? ? else:
? ? ? ? ? ? raise TypeError(f"沒(méi)有名為{brand}的手機(jī)生產(chǎn)商。")
? ? ? ??

if __name__ == "__main__":
? ? # 通過(guò)簡(jiǎn)單工廠類(lèi)提供的接口函數(shù)來(lái)獲得某個(gè)具體的產(chǎn)品類(lèi)的對(duì)象
? ? Xiaomi = PhoneBrandFactory().create_productor("Xiaomi")
? ? Huawei = PhoneBrandFactory().create_productor("Huawei")
? ? print(Xiaomi)
? ? print(Huawei)
? ? print(Xiaomi.product(2999))
? ? print(Huawei.product(5999))

2、工廠方法模式

工廠方法模式,工廠類(lèi)派生了任意個(gè)子工廠類(lèi),每個(gè)子工廠類(lèi)對(duì)應(yīng)一個(gè)具體的產(chǎn)品類(lèi),則某個(gè)產(chǎn)品類(lèi)的對(duì)象的實(shí)例化就交由這個(gè)子工廠類(lèi)來(lái)完成。

工廠方法模式是簡(jiǎn)單工廠模式的改進(jìn),當(dāng)我們需要擴(kuò)展一個(gè)新產(chǎn)品時(shí),只需要擴(kuò)展一個(gè)新的子工廠類(lèi)即可,而不用去修改工廠類(lèi)原有的代碼,這樣就符合了開(kāi)閉原則。

優(yōu)點(diǎn): 擴(kuò)展性好,符合了開(kāi)閉原則。新增一種產(chǎn)品時(shí),只需增加改對(duì)應(yīng)的產(chǎn)品類(lèi)和對(duì)應(yīng)的工廠子類(lèi)即可。同時(shí),也使得每個(gè)產(chǎn)品類(lèi)和對(duì)應(yīng)的工廠子類(lèi)符合了單一職責(zé)原則,每個(gè)工廠只負(fù)責(zé)一種產(chǎn)品,而不是由一個(gè)工廠去生成所有商品。

缺點(diǎn): 當(dāng)我們新增產(chǎn)品時(shí),還需要提供對(duì)應(yīng)的工廠類(lèi),系統(tǒng)中類(lèi)的個(gè)數(shù)將會(huì)成倍增加,相當(dāng)于增加了系統(tǒng)的復(fù)雜性。

實(shí)體角色:

  • 產(chǎn)品的抽象類(lèi)
  • 具體的產(chǎn)品子類(lèi)
  • 工廠類(lèi)
  • 具體的工廠子類(lèi)
import abc

# 產(chǎn)品的抽象類(lèi)
class Productor(metaclass=abc.ABCMeta):
? ? @abc.abstractmethod
? ? def product(self, car):
? ? ? ? pass
? ? ? ??
# 更具體的某個(gè)產(chǎn)品類(lèi),是產(chǎn)品抽象類(lèi)的子類(lèi)
class Xiaomi(Productor):
? ? """
? ? 小米手機(jī)
? ? """
? ? def product(self, price):
? ? ? ? return f"制造一部小米手機(jī),售價(jià){price}元"
? ? ? ??
? ? def __repr__(self):
? ? ? ? return f"Xiaomi,{id(self)}"?
? ??
# 更具體的某個(gè)產(chǎn)品類(lèi),是產(chǎn)品抽象類(lèi)的子類(lèi)
class Huawei(Productor):
? ? """
? ? 華為手機(jī)
? ? """
? ? def product(self, price):
? ? ? ? return f"制造一部華為手機(jī),售價(jià){price}元"
? ? ? ??
? ? def __repr__(self):
? ? ? ? return f"Huawei,{id(self)}"?
? ??
# 工廠類(lèi)
class PhoneBrandFactory(metaclass=abc.ABCMeta):
? ? """
? ? 抽象工廠
? ? """
? ? @abc.abstractmethod
? ? def create_productor(self, brand):
? ? ? ? pass
? ??
# 具體產(chǎn)品對(duì)應(yīng)的子工廠類(lèi)
class XiaomiFactory(PhoneBrandFactory):
? ? def create_productor(self):
? ? ? ? return Xiaomi()
? ??
# 具體產(chǎn)品對(duì)應(yīng)的子工廠類(lèi)
class HuaweiFactory(PhoneBrandFactory):
? ? def create_productor(self):
? ? ? ? return Huawei()


if __name__ == "__main__":
? ? # 由這個(gè)子工廠類(lèi)來(lái)完成對(duì)應(yīng)的某個(gè)產(chǎn)品類(lèi)的對(duì)象實(shí)例化
? ? Xiaomi = XiaomiFactory().create_productor()
? ? Huawei = HuaweiFactory().create_productor()
? ? print(Xiaomi)
? ? print(Huawei)
? ? print(Xiaomi.product(2999))
? ? print(Huawei.product(5999))

3、抽象工廠模式

抽象工廠模式,又是工廠方法模式的改進(jìn)。工廠方法模式解決的是生產(chǎn)不同品牌的同一類(lèi)型的電腦,而抽象工廠模式解決的是生產(chǎn)不同品牌的多種類(lèi)型的電腦。

比如,工廠方法模式中的電腦工廠只能生產(chǎn)老式的臺(tái)式電腦,而如果現(xiàn)在需要生產(chǎn)臺(tái)式電腦,筆記本電腦,平板電腦等多個(gè)種類(lèi)的電腦的話,那么工廠方法模式就不太方便了。而抽象工廠模式可以解決電腦工廠生產(chǎn)多個(gè)種類(lèi)電腦的問(wèn)題,也就是解決一個(gè)工廠生產(chǎn)多種類(lèi)型的產(chǎn)品的問(wèn)題。

如果我們需要臺(tái)式電腦,又需要筆記本電腦,要多種產(chǎn)品時(shí),工廠方法模式無(wú)法滿足我們的需求;而抽象方法模式,提前在抽象工廠中,定義好了可能需要的多種產(chǎn)品,比如:臺(tái)式電腦,筆記本電腦,平板電腦等,當(dāng)有需求的時(shí)候,我們只需要?jiǎng)?chuàng)建相關(guān)子類(lèi)和相關(guān)子工廠類(lèi)即可。

優(yōu)點(diǎn): 抽象工廠類(lèi)創(chuàng)建了多個(gè)類(lèi)型的產(chǎn)品,當(dāng)有需求時(shí),可以創(chuàng)建相關(guān)子產(chǎn)品類(lèi)和子工廠類(lèi)來(lái)獲取。也就是可以滿足生產(chǎn)不同品牌的不同類(lèi)型的電腦。

缺點(diǎn): 擴(kuò)展新種類(lèi)產(chǎn)品時(shí)困難。抽象工廠模式需要我們?cè)诠S抽象類(lèi)中提前確定了可能需要的產(chǎn)品種類(lèi),以滿足不同品牌的多種產(chǎn)品的需求。但是如果我們需要的產(chǎn)品種類(lèi)并沒(méi)有在工廠抽象類(lèi)中提前確定,那我們就需要去修改工廠抽象類(lèi)了,而一旦修改了工廠抽象類(lèi),那么所有的工廠子類(lèi)也需要修改,這樣顯然擴(kuò)展不方便。

實(shí)體角色:

  • 產(chǎn)品功能特性抽象類(lèi)
  • 具體的產(chǎn)品功能特性子類(lèi)
  • 產(chǎn)品的抽象類(lèi)
  • 具體的產(chǎn)品子類(lèi)
  • 抽象工廠類(lèi)
import abc

# 產(chǎn)品功能特性抽象類(lèi)
class PhoneShell(metaclass=abc.ABCMeta):
? ? @abc.abstractmethod
? ? def shell(self):
? ? ? ? pass
? ?
class Cpu(metaclass=abc.ABCMeta):
? ? @abc.abstractmethod
? ? def cpu(self):
? ? ? ? pass
? ? ?
class OS(metaclass=abc.ABCMeta):
? ? @abc.abstractmethod
? ? def system(self):
? ? ? ? pass
? ??
# 具體的產(chǎn)品功能特性類(lèi)
class SmallShell(PhoneShell):
? ? @property
? ? def shell(self):
? ? ? ? return "小屏幕"

class BigShell(PhoneShell):
? ? @property
? ? def shell(self):
? ? ? ? return "大屏幕"
? ??
class SnapDragonCpu(Cpu):
? ? @property
? ? def cpu(self):
? ? ? ? return "驍龍cpu"
? ? ? ??
class AppleCpu(Cpu):
? ? @property
? ? def cpu(self):
? ? ? ? return "蘋(píng)果cpu"
? ? ? ??
class Android(OS):
? ? @property
? ? def system(self):
? ? ? ? return "安卓系統(tǒng)" ? ?
? ??
class IOS(OS):
? ? @property
? ? def system(self):
? ? ? ? return "IOS系統(tǒng)"
? ??
# 產(chǎn)品的抽象類(lèi)
class ProductPhone:
? ??
? ? def __init__(self, factory):
? ? ? ? self.factory = factory()
? ? ? ??
? ? def product(self):
? ? ? ? self.shell = self.factory.product_shell()
? ? ? ? self.cpu = self.factory.product_cpu()
? ? ? ? self.OS = self.factory.product_system()
? ??
? ? def show_info(self):
? ? ? ? print(f"{self.factory}", f"配置信息:{self.shell.shell}, {self.cpu.cpu}, {self.OS.system}")
? ? ? ? ? ??
# 具體的產(chǎn)品子類(lèi)
class XiaomiFactory(PhoneFactory):
? ? def product_shell(self):
? ? ? ? return BigShell()
? ??
? ? def product_cpu(self):
? ? ? ? return SnapDragonCpu()
? ??
? ? def product_system(self):
? ? ? ? return Android()
? ??
? ? def __repr__(self):
? ? ? ? return "小米手機(jī),售價(jià)2999!"
? ? ? ??
class IphoneFactory(PhoneFactory):
? ? def product_shell(self):
? ? ? ? return SmallShell()
? ??
? ? def product_cpu(self):
? ? ? ? return AppleCpu()
? ??
? ? def product_system(self):
? ? ? ? return IOS()
? ??
? ? def __repr__(self):
? ? ? ? return "蘋(píng)果手機(jī),售價(jià)8999!"
? ??
# 抽象工廠類(lèi)
class PhoneFactory(metaclass=abc.ABCMeta):
? ? @abc.abstractmethod
? ? def product_shell(self):
? ? ? ? pass
? ??
? ? @abc.abstractmethod
? ? def product_cpu(self):
? ? ? ? pass
? ??
? ? @abc.abstractmethod
? ? def product_system(self):
? ? ? ? pass?

? ? ? ??
if __name__ == "__main__":
? ? xiaomi = ProductPhone(XiaomiFactory)
? ? xiaomi.product()
? ? xiaomi.show_info()
? ??
? ? iphone = ProductPhone(IphoneFactory)
? ? iphone.product()
? ? iphone.show_info()

到此這篇關(guān)于Python設(shè)計(jì)模式中的創(chuàng)建型工廠模式的文章就介紹到這了,更多相關(guān)Python工廠模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python requests模擬登陸github的實(shí)現(xiàn)方法

    python requests模擬登陸github的實(shí)現(xiàn)方法

    這篇文章主要介紹了python requests模擬登陸github的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Python實(shí)現(xiàn)自動(dòng)玩連連看的腳本分享

    Python實(shí)現(xiàn)自動(dòng)玩連連看的腳本分享

    最近女朋友在玩連連看,玩了一個(gè)星期了還沒(méi)通關(guān),真的是菜。實(shí)在是看不過(guò)去了,直接用python寫(xiě)了個(gè)腳本代碼可以自動(dòng)玩連連看,感興趣的可以了解一下
    2022-04-04
  • python中的GUI實(shí)現(xiàn)計(jì)算器

    python中的GUI實(shí)現(xiàn)計(jì)算器

    這篇文章主要介紹了如何利用python中的GUI實(shí)現(xiàn)計(jì)算器,文章教大家用用python的GUI做界面布局,計(jì)算器代碼熟悉控件的使用方法、優(yōu)化計(jì)算器代碼,解決獲取按鈕文本的方法,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2021-12-12
  • OpenCV-Python實(shí)現(xiàn)圖像平滑處理操作

    OpenCV-Python實(shí)現(xiàn)圖像平滑處理操作

    圖像平滑處理的噪聲取值主要有6種方法,本文主要介紹了這6種方法的具體使用并配置實(shí)例方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-06-06
  • Python代理IP爬蟲(chóng)的新手使用教程

    Python代理IP爬蟲(chóng)的新手使用教程

    這篇文章主要給大家介紹了關(guān)于Python代理IP爬蟲(chóng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Django搭建MySQL主從實(shí)現(xiàn)讀寫(xiě)分離

    Django搭建MySQL主從實(shí)現(xiàn)讀寫(xiě)分離

    本文主要介紹了Django搭建MySQL主從實(shí)現(xiàn)讀寫(xiě)分離,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • python實(shí)戰(zhàn)教程之自動(dòng)掃雷

    python實(shí)戰(zhàn)教程之自動(dòng)掃雷

    用python實(shí)現(xiàn)掃雷,非常有意思,這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)自動(dòng)掃雷的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Python實(shí)現(xiàn)的桶排序算法示例

    Python實(shí)現(xiàn)的桶排序算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的桶排序算法,簡(jiǎn)單說(shuō)明了桶排序的概念、原理及優(yōu)缺點(diǎn),并結(jié)合實(shí)例形式演示了Python實(shí)現(xiàn)桶排序的方法,需要的朋友可以參考下
    2017-11-11
  • python裝飾器property和setter用法

    python裝飾器property和setter用法

    這篇文章主要介紹了python裝飾器property和setter用法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • pytorch交叉熵?fù)p失函數(shù)的weight參數(shù)的使用

    pytorch交叉熵?fù)p失函數(shù)的weight參數(shù)的使用

    這篇文章主要介紹了pytorch交叉熵?fù)p失函數(shù)的weight參數(shù)的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05

最新評(píng)論