新聞中心
今天給大家介紹一個非常簡單的設(shè)計模式,一學(xué)就會,非常好用。

曲麻萊網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
這個模式叫做抽象工廠模式,大家可能對工廠模式比較熟悉,在工廠模式當中封裝了實例的創(chuàng)建邏輯。主要的用途一般是將一些復(fù)雜的類的創(chuàng)建過程整合在一起,通過參數(shù)控制,這樣使用者可以較簡單地獲得實例。
抽象工廠
抽象工廠模式和工廠模式類似,只不過更加抽象了一層。在創(chuàng)建實例的時候,不是通過參數(shù)來控制,而是直接傳入想要創(chuàng)建的類。這一點其實也是Python的特性,一切皆是對象,一切皆可傳參,類本身也是一個對象,類也是可以傳參的。所以我們可以把一個類直接傳入工廠,工廠通過類來創(chuàng)建實例。
我們來用代碼簡單演示一下:
- class AbstractFactory:
- def __init__(self, cls):
- self.cls = cls
- def build(self, *args, **kw):
- return self.cls(*args, **kw)
這段代碼大家都能看懂,但是這其實也不能完全叫做抽象工廠,因為體現(xiàn)不出來抽象。這里的抽象主要是把工廠當做了一個更高階的抽象類,有點像是抽象類的反向使用。
我們一般使用抽象類都是這樣:
- import abc
- class AbstractClass:
- def __init__(self):
- pass
- @abc.abstractmethod
- def run(self, *args, **kw):
- pass
然后它的派生類再去實現(xiàn)抽象類當中定義的抽象方法,而這里的順序則是反的。父類當中的邏輯其實也是定好的,只是它在具體執(zhí)行的時候是調(diào)用傳入的子類實例實現(xiàn)的。
為了更好說明,我們來看一個例子吧:
- 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()
在這個例子當中,Dog和Cat是子類,PetCollection是父類。我們可以發(fā)現(xiàn)在父類當中也實現(xiàn)了speak這個方法,但是它是調(diào)用子類的speak實現(xiàn)的。也就是說凡是擁有speak這個類的子類都可以用來創(chuàng)建PetCollection,這個PetCollection相當于一個抽象的通用類,這樣我們在使用的時候可以用它來集成很多邏輯,簡化操作。
我第一次看這個設(shè)計模式的時候,覺得普普通通,不過是把類當做參數(shù)而已。但是之后又看了一次,又有了新的理解,這不也是抽象類的反向使用嗎?其實代碼的核心就只有邏輯,所謂的設(shè)計模式也不過是前人總結(jié)出的經(jīng)驗而已。真正有價值的并不是這個模式當中的代碼怎么寫,而是核心的邏輯,這些融會貫通了,以后也不難設(shè)計出我們自己的模式來。
本文轉(zhuǎn)載自微信公眾號「TechFlow」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系TechFlow公眾號。
分享標題:設(shè)計模式——把類作為參數(shù)的抽象工廠模式
文章地址:http://m.fisionsoft.com.cn/article/djdegoi.html


咨詢
建站咨詢
