国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用Python實(shí)現(xiàn)設(shè)計(jì)模式——工廠模式

CrazyCodes / 1046人閱讀

摘要:本文會(huì)用實(shí)現(xiàn)三種工廠模式的簡(jiǎn)單例子,所有代碼都托管在上。工廠方法模式繼承了簡(jiǎn)單工廠模式的優(yōu)點(diǎn)又有所改進(jìn),其不再通過一個(gè)工廠類來負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給相應(yīng)的子類去做,這使得工廠方法模式可以允許系統(tǒng)能夠更高效的擴(kuò)展。

前言

工廠模式,顧名思義就是我們可以通過一個(gè)指定的“工廠”獲得需要的“產(chǎn)品”,在設(shè)計(jì)模式中主要用于抽象對(duì)象的創(chuàng)建過程,讓用戶可以指定自己想要的對(duì)象而不必關(guān)心對(duì)象的實(shí)例化過程。這樣做的好處是用戶只需通過固定的接口而不是直接去調(diào)用類的實(shí)例化方法來獲得一個(gè)對(duì)象的實(shí)例,隱藏了實(shí)例創(chuàng)建過程的復(fù)雜度,解耦了生產(chǎn)實(shí)例和使用實(shí)例的代碼,降低了維護(hù)的復(fù)雜性。
本文會(huì)用Python實(shí)現(xiàn)三種工廠模式的簡(jiǎn)單例子,所有代碼都托管在Github上。

簡(jiǎn)單工廠

首先,我們先看一個(gè)簡(jiǎn)單工廠的例子:

#coding=utf-8
class Mercedes(object):
    """梅賽德斯
    """
    def __repr__(self):
        return "Mercedes-Benz"

class BMW(object):
    """寶馬
    """
    def __repr__(self):
        return "BMW"

假設(shè)我們有兩個(gè)“產(chǎn)品”分別是MercedesBMW的汽車,如果沒有“工廠”來生產(chǎn)它們,我們就要在代碼中自己進(jìn)行實(shí)例化,如:

mercedes = Mercedes()
bmw = BMW()

但現(xiàn)實(shí)中,你可能會(huì)面對(duì)很多汽車產(chǎn)品,而且每個(gè)產(chǎn)品的構(gòu)造參數(shù)還不一樣,這樣在創(chuàng)建實(shí)例時(shí)會(huì)遇到麻煩。這時(shí)就可以構(gòu)造一個(gè)“簡(jiǎn)單工廠”把所有汽車實(shí)例化的過程封裝在里面。

class SimpleCarFactory(object):
    """簡(jiǎn)單工廠
    """
    @staticmethod
    def product_car(name):
        if name == "mb":
            return Mercedes()
        elif name == "bmw":
            return BMW()

有了SimpleCarFactory類后,就可以通過向固定的接口傳入?yún)?shù)獲得想要的對(duì)象實(shí)例,如下:

c1 = SimpleCarFactory.product_car("mb")
c2 = SimpleCarFactory.product_car("bmw")
工廠方法

雖然有了一個(gè)簡(jiǎn)單的工廠,但在實(shí)際使用工廠的過程中,我們會(huì)發(fā)現(xiàn)新問題:如果我們要新增一個(gè)“產(chǎn)品”,例如Audi的汽車,我們除了新增一個(gè)Audi類外還要修改SimpleCarFactory內(nèi)的product_car方法。這樣就違背了軟件設(shè)計(jì)中的開閉原則[1],即在擴(kuò)展新的類時(shí),盡量不要修改原有代碼。所以我們?cè)诤?jiǎn)單工廠的基礎(chǔ)上把SimpleCarFactory抽象成不同的工廠,每個(gè)工廠對(duì)應(yīng)生成自己的產(chǎn)品,這就是工廠方法。

#coding=utf-8
import abc

class AbstractFactory(object):
    """抽象工廠
    """
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def product_car(self):
        pass

class MercedesFactory(AbstractFactory):
    """梅賽德斯工廠
    """
    def product_car(self):
        return Mercedes()

class BMWFactory(AbstractFactory):
    """寶馬工廠
    """
    def product_car(self):
        return BMW()

我們把工廠抽象出來用abc模塊[2]實(shí)現(xiàn)了一個(gè)抽象的基類AbstractFactory,這樣就可以通過特定的工廠來獲得特定的產(chǎn)品實(shí)例了:

c1 = MercedesFactory().product_car()
c2 = BMWFactory().product_car()

每個(gè)工廠負(fù)責(zé)生產(chǎn)自己的產(chǎn)品也避免了我們?cè)谛略霎a(chǎn)品時(shí)需要修改工廠的代碼,而只要增加相應(yīng)的工廠即可。如新增一個(gè)Audi產(chǎn)品,只需新增一個(gè)Audi類和AudiFactory類。

抽象工廠

工廠方法雖然解決了我們“修改代碼”的問題,但如果我們要生產(chǎn)很多產(chǎn)品,就會(huì)發(fā)現(xiàn)我們同樣需要寫很多對(duì)應(yīng)的工廠類。比如如果MercedesFactoryBMWFactory不僅生產(chǎn)小汽車,還要生產(chǎn)SUV,那我們用工廠方法就要再多構(gòu)造兩個(gè)生產(chǎn)SUV的工廠類。所以為了解決這個(gè)問題,我們就要再更進(jìn)一步的抽象工廠類,讓一個(gè)工廠可以生產(chǎn)同一類的多個(gè)產(chǎn)品,這就是抽象工廠。具體實(shí)現(xiàn)如下:

#coding=utf-8
import abc

# 兩種小汽車
class Mercedes_C63(object):
    """梅賽德斯 C63
    """
    def __repr__(self):
        return "Mercedes-Benz: C63"

class BMW_M3(object):
    """寶馬 M3
    """
    def __repr__(self):
        return "BMW: M3"

# 兩種SUV
class Mercedes_G63(object):
    """梅賽德斯 G63
    """
    def __repr__(self):
        return "Mercedes-Benz: G63"

class BMW_X5(object):
    """寶馬 X5
    """
    def __repr__(self):
        return "BMW: X5"

class AbstractFactory(object):
    """抽象工廠
    可以生產(chǎn)小汽車外,還可以生產(chǎn)SUV
    """
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def product_car(self):
        pass

    @abc.abstractmethod
    def product_suv(self):
        pass

class MercedesFactory(AbstractFactory):
    """梅賽德斯工廠
    """
    def product_car(self):
        return Mercedes_C63()

    def product_suv(self):
        return Mercedes_G63()

class BMWFactory(AbstractFactory):
    """寶馬工廠
    """
    def product_car(self):
        return BMW_M3()

    def product_suv(self):
        return BMW_X5()

我們讓基類AbstractFactory同時(shí)可以生產(chǎn)汽車和SUV,然后令MercedesFactoryBMWFactory繼承AbstractFactory并重寫product_car和product_suv方法即可。

c1 = MercedesFactory().product_car()
s1 = MercedesFactory().product_suv()
print(c1, s1)
s2 = BMWFactory().product_suv()
c2 = BMWFactory().product_car()
print(c2, s2)

抽象工廠模式與工廠方法模式最大的區(qū)別在于,抽象工廠中的一個(gè)工廠對(duì)象可以負(fù)責(zé)多個(gè)不同產(chǎn)品對(duì)象的創(chuàng)建 ,這樣比工廠方法模式更為簡(jiǎn)單、有效率。

結(jié)論

初學(xué)設(shè)計(jì)模式時(shí)會(huì)對(duì)三種工廠模式的實(shí)際應(yīng)用比較困惑,其實(shí)三種模式各有優(yōu)缺點(diǎn),應(yīng)用的場(chǎng)景也不盡相同:

簡(jiǎn)單工廠模式適用于需創(chuàng)建的對(duì)象較少,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜的情況下,而且用戶只關(guān)心那種類型的實(shí)例被創(chuàng)建,并不關(guān)心其初始化過程時(shí),比如多種數(shù)據(jù)庫(kù)(MySQL/MongoDB)的實(shí)例,多種格式文件的解析器(XML/JSON)等。

工廠方法模式繼承了簡(jiǎn)單工廠模式的優(yōu)點(diǎn)又有所改進(jìn),其不再通過一個(gè)工廠類來負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給相應(yīng)的子類去做,這使得工廠方法模式可以允許系統(tǒng)能夠更高效的擴(kuò)展。實(shí)際應(yīng)用中可以用來實(shí)現(xiàn)系統(tǒng)的日志系統(tǒng)等,比如具體的程序運(yùn)行日志,網(wǎng)絡(luò)日志,數(shù)據(jù)庫(kù)日志等都可以用具體的工廠類來創(chuàng)建。

抽象工廠模式在工廠方法基礎(chǔ)上擴(kuò)展了工廠對(duì)多個(gè)產(chǎn)品創(chuàng)建的支持,更適合一些大型系統(tǒng),比如系統(tǒng)中有多于一個(gè)的產(chǎn)品族,且這些產(chǎn)品族類的產(chǎn)品需實(shí)現(xiàn)同樣的接口,像很多軟件系統(tǒng)界面中不同主題下不同的按鈕、文本框、字體等等。

參考

[1]維基百科
[2]Python官方文檔


2018/1/30更新:修改工廠方法的代碼示例,新增結(jié)論一節(jié)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41319.html

相關(guān)文章

  • python設(shè)計(jì)模式-抽象工廠模式

    摘要:源碼參考抽象工廠模式抽象工廠模式提供一個(gè)接口,用于創(chuàng)建相關(guān)或依賴對(duì)象的家族,而不需要指定具體類。工廠方法模式和抽象工廠模式如何選擇開始的時(shí)候,可以選擇工廠方法模式,因?yàn)樗芎?jiǎn)單只需要繼承,并實(shí)現(xiàn)工廠方法即可。 問題:在上一篇 python設(shè)計(jì)模式:工廠方法模式我們嘗試使用工廠方法創(chuàng)建了披薩店,現(xiàn)在為了保證披薩加盟店也能有良好的聲譽(yù),我們需要統(tǒng)一原材料,這個(gè)該如何做呢? 為了確保每家加盟...

    seal_de 評(píng)論0 收藏0
  • 設(shè)計(jì)模式工廠方法模式

    摘要:通過工廠方法模式的類圖可以看到,工廠方法模式有四個(gè)要素工廠接口工廠接口是工廠方法模式的核心,與調(diào)用者直接交互用來提供產(chǎn)品。使用場(chǎng)景創(chuàng)建類模式,在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠方法模式。 0x01.定義與類型 定義:定義一個(gè)創(chuàng)建對(duì)象的接口,但讓實(shí)現(xiàn)這個(gè)接口的類來決定實(shí)例化那個(gè)類,工廠方法讓類的實(shí)例化推遲到子類中進(jìn)行 類型:創(chuàng)建型 uml類圖 showImg(https:/...

    geekidentity 評(píng)論0 收藏0
  • 設(shè)計(jì)模式之簡(jiǎn)單工廠模式

    摘要:類型創(chuàng)建型,但不屬于中設(shè)計(jì)模式。簡(jiǎn)介通過一個(gè)專門的工廠類來創(chuàng)建其他類,這些被創(chuàng)建的類通常有一個(gè)共同的父類或接口。相關(guān)代碼簡(jiǎn)單工廠模式推薦閱讀慕課網(wǎng)設(shè)計(jì)模式精講簡(jiǎn)單工廠模式 0x01.定義與類型 定義:由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。 類型:創(chuàng)建型,但不屬于GOF23中設(shè)計(jì)模式。 簡(jiǎn)介:通過一個(gè)專門的工廠類來創(chuàng)建其他類,這些被創(chuàng)建的類通常有一個(gè)共同的父類或接口。 uml類圖...

    mo0n1andin 評(píng)論0 收藏0
  • python設(shè)計(jì)模式-工廠方法模式

    摘要:工廠方法模式可以幫助我們將產(chǎn)品的實(shí)現(xiàn)從使用中解耦。應(yīng)用中使用工廠模式的例子的模塊使用工廠方法模式來創(chuàng)建表單字段。也使用到了工廠方法模式。中不同數(shù)據(jù)庫(kù)連接部分也用到了工廠方法模式。 題目:假設(shè)你有一個(gè) pizza 店,功能包括下訂單、做 pizza,你的代碼會(huì)如何寫呢? def order_pizza(): pizza = Pizza() pizza.prepare() ...

    pubdreamcc 評(píng)論0 收藏0
  • python之單例模式工廠模式

    摘要:在工廠方法模式中,我們會(huì)遇到一個(gè)問題,當(dāng)產(chǎn)品非常多時(shí),繼續(xù)使用工廠方法模式會(huì)產(chǎn)生非常多的工廠類。從簡(jiǎn)單工廠模式到抽象工廠模式,我們都是在用后一種模式解決前一種模式的缺陷,都是在最大程度降低代碼的耦合性。 單例模式 所謂單例模式,也就是說不管什么時(shí)候我們要確保只有一個(gè)對(duì)象實(shí)例存在。很多情況下,整個(gè)系統(tǒng)中只需要存在一個(gè)對(duì)象,所有的信息都從這個(gè)對(duì)象獲取,比如系統(tǒng)的配置對(duì)象,或者是線程池。這些...

    jayce 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<