日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
設(shè)計(jì)模式——把類作為參數(shù)的抽象工廠模式

今天給大家介紹一個(gè)非常簡單的設(shè)計(jì)模式,一學(xué)就會(huì),非常好用。

曲麻萊網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)

這個(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í)例。

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

 
 
 
 
  1. class AbstractFactory: 
  2.     def __init__(self, cls): 
  3.         self.cls = cls 
  4.          
  5.     def build(self, *args, **kw): 
  6.         return self.cls(*args, **kw) 

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

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

 
 
 
 
  1. import abc 
  2.  
  3. class AbstractClass: 
  4.     def __init__(self): 
  5.         pass 
  6.      
  7.     @abc.abstractmethod 
  8.     def run(self, *args, **kw): 
  9.         pass 

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

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

 
 
 
 
  1. class PetCollection(object): 
  2.  
  3.     def __init__(self, animal): 
  4.         self.pet_generator = animal 
  5.         self.pet = self.pet_generator() 
  6.      
  7.     def speak(self): 
  8.         self.pet.speak() 
  9.  
  10.     def show_pet(self): 
  11.         pet = self.pet 
  12.         print('Pet\'s name is {}'.format(pet)) 
  13.         print('It says: {}!'.format(pet.speak())) 
  14.  
  15.  
  16. class Dog(object): 
  17.     def speak(self): 
  18.         return 'woof' 
  19.  
  20.     def __str__(self): 
  21.         return 'dog' 
  22.  
  23.  
  24. class Cat(object): 
  25.     def speak(self): 
  26.         return 'meow' 
  27.  
  28.     def __str__(self): 
  29.         return 'cat' 
  30.  
  31. if __name__ == '__main__': 
  32.     pet = PetCollection(Dog) 
  33.     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ì)出我們自己的模式來。

本文轉(zhuǎn)載自微信公眾號(hào)「TechFlow」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系TechFlow公眾號(hào)。


文章名稱:設(shè)計(jì)模式——把類作為參數(shù)的抽象工廠模式
本文來源:http://www.5511xx.com/article/djdegoi.html