亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解設計模式之把類作為參數的抽象工廠模式

發布時間:2021-10-21 15:07:42 來源:億速云 閱讀:158 作者:iii 欄目:web開發

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

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

抽象工廠

抽象工廠模式和工廠模式類似,只不過更加抽象了一層。在創建實例的時候,不是通過參數來控制,而是直接傳入想要創建的類。這一點其實也是Python的特性,一切皆是對象,一切皆可傳參,類本身也是一個對象,類也是可以傳參的。所以我們可以把一個類直接傳入工廠,工廠通過類來創建實例。

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

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

這段代碼大家都能看懂,但是這其實也不能完全叫做抽象工廠,因為體現不出來抽象。這里的抽象主要是把工廠當做了一個更高階的抽象類,有點像是抽象類的反向使用。

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

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

然后它的派生類再去實現抽象類當中定義的抽象方法,而這里的順序則是反的。父類當中的邏輯其實也是定好的,只是它在具體執行的時候是調用傳入的子類實例實現的。

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

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是父類。我們可以發現在父類當中也實現了speak這個方法,但是它是調用子類的speak實現的。也就是說凡是擁有speak這個類的子類都可以用來創建PetCollection,這個PetCollection相當于一個抽象的通用類,這樣我們在使用的時候可以用它來集成很多邏輯,簡化操作。

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

到此,相信大家對“如何理解設計模式之把類作為參數的抽象工廠模式”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涞源县| 石柱| 元江| 扎兰屯市| 天镇县| 江津市| 郁南县| 舞钢市| 潞城市| 饶平县| 邻水| 赤水市| 灌云县| 江山市| 应城市| 开江县| 宜兰县| 留坝县| 渭南市| 新源县| 奎屯市| 松潘县| 团风县| 苏尼特右旗| 双鸭山市| 卢龙县| 申扎县| 洛川县| 连江县| 乌兰县| 商丘市| 五常市| 武鸣县| 博客| 宁远县| 大名县| 周宁县| 北碚区| 三都| 唐海县| 邢台县|