溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解設(shè)計(jì)模式之把類作為參數(shù)的抽象工廠模式

發(fā)布時(shí)間:2021-10-21 15:07:42 來源:億速云 閱讀:148 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“如何理解設(shè)計(jì)模式之把類作為參數(shù)的抽象工廠模式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何理解設(shè)計(jì)模式之把類作為參數(shù)的抽象工廠模式”吧!

這個(gè)模式叫做抽象工廠模式,大家可能對(duì)工廠模式比較熟悉,在工廠模式當(dāng)中封裝了實(shí)例的創(chuàng)建邏輯。主要的用途一般是將一些復(fù)雜的類的創(chuàng)建過程整合在一起,通過參數(shù)控制,這樣使用者可以較簡單地獲得實(shí)例。

抽象工廠

抽象工廠模式和工廠模式類似,只不過更加抽象了一層。在創(chuàng)建實(shí)例的時(shí)候,不是通過參數(shù)來控制,而是直接傳入想要?jiǎng)?chuàng)建的類。這一點(diǎn)其實(shí)也是Python的特性,一切皆是對(duì)象,一切皆可傳參,類本身也是一個(gè)對(duì)象,類也是可以傳參的。所以我們可以把一個(gè)類直接傳入工廠,工廠通過類來創(chuàng)建實(shí)例。

我們來用代碼簡單演示一下:

class AbstractFactory:     def __init__(self, cls):         self.cls = cls              def build(self, *args, **kw):         return self.cls(*args, **kw)

這段代碼大家都能看懂,但是這其實(shí)也不能完全叫做抽象工廠,因?yàn)轶w現(xiàn)不出來抽象。這里的抽象主要是把工廠當(dāng)做了一個(gè)更高階的抽象類,有點(diǎn)像是抽象類的反向使用。

我們一般使用抽象類都是這樣:

import abc  class AbstractClass:     def __init__(self):         pass          @abc.abstractmethod     def run(self, *args, **kw):         pass

然后它的派生類再去實(shí)現(xiàn)抽象類當(dāng)中定義的抽象方法,而這里的順序則是反的。父類當(dāng)中的邏輯其實(shí)也是定好的,只是它在具體執(zhí)行的時(shí)候是調(diào)用傳入的子類實(shí)例實(shí)現(xiàn)的。

為了更好說明,我們來看一個(gè)例子吧:

class PetCollection(object):      def __init__(self, animal):         self.pet_generator = animal         self.pet = self.pet_generator()          def speak(self):         self.pet.speak()      def show_pet(self):         pet = self.pet         print('Pet\'s name is {}'.format(pet))         print('It says: {}!'.format(pet.speak()))   class Dog(object):     def speak(self):         return 'woof'      def __str__(self):         return 'dog'   class Cat(object):     def speak(self):         return 'meow'      def __str__(self):         return 'cat'  if __name__ == '__main__':     pet = PetCollection(Dog)     pet.show_pet()

在這個(gè)例子當(dāng)中,Dog和Cat是子類,PetCollection是父類。我們可以發(fā)現(xiàn)在父類當(dāng)中也實(shí)現(xiàn)了speak這個(gè)方法,但是它是調(diào)用子類的speak實(shí)現(xiàn)的。也就是說凡是擁有speak這個(gè)類的子類都可以用來創(chuàng)建PetCollection,這個(gè)PetCollection相當(dāng)于一個(gè)抽象的通用類,這樣我們?cè)谑褂玫臅r(shí)候可以用它來集成很多邏輯,簡化操作。

我第一次看這個(gè)設(shè)計(jì)模式的時(shí)候,覺得普普通通,不過是把類當(dāng)做參數(shù)而已。但是之后又看了一次,又有了新的理解,這不也是抽象類的反向使用嗎?其實(shí)代碼的核心就只有邏輯,所謂的設(shè)計(jì)模式也不過是前人總結(jié)出的經(jīng)驗(yàn)而已。真正有價(jià)值的并不是這個(gè)模式當(dāng)中的代碼怎么寫,而是核心的邏輯,這些融會(huì)貫通了,以后也不難設(shè)計(jì)出我們自己的模式來。

到此,相信大家對(duì)“如何理解設(shè)計(jì)模式之把類作為參數(shù)的抽象工廠模式”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI