什麼是工廠類別?工廠類別是一種創建一個或多個不同類別的物件的類別。
工廠模式可以說是軟體工程中最常用的設計模式。在本文中,我將使用一個簡單的範例問題深入解釋簡單工廠和工廠方法設計模式。
假設我們要創建一個支援兩種動物(例如狗和貓)的系統,每個動物類別都應該有一個方法來發出動物的聲音類型。現在,客戶希望使用該系統根據客戶的使用者輸入發出動物的聲音。上述問題的基本解決方案可以寫成如下:
from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def make_sound(self): pass class Dog(Animal): def make_sound(self): print("Bhow Bhow!") class Cat(Animal): def make_sound(self): print("Meow Meow!")
透過這個解決方案,我們的客戶將像這樣使用系統
## client code if __name__ == '__main__': animal_type = input("Which animal should make sound Dog or Cat?") if animal_type.lower() == 'dog': Dog().make_sound() elif animal_type.lower() == 'cat': Cat().make_sound()
我們的解決方案可以正常工作,但簡單工廠模式表明我們可以做得更好。為什麼?正如您在上面的客戶端程式碼中看到的,客戶端必須決定一次要呼叫哪個動物類別。想像一下該系統有十種不同的動物類別。您已經可以看到我們的客戶使用該系統會遇到多大的問題。
所以這裡簡單工廠模式只是說,不要讓客戶端決定呼叫哪個類,而是讓系統為客戶端決定。
要使用簡單工廠模式解決問題,我們所需要做的就是創建一個工廠類,其中包含負責動物物件創建的方法。
... ... class AnimalFactory: def make_sound(self, animal_type): return eval(animal_type.title())().make_sound()
透過這種方法,客戶端程式碼變成:
## client code if __name__ == '__main__': animal_type = input("Which animal should make sound Dog or Cat?") AnimalFactory().make_sound(animal_type)
總之,簡單工廠模式就是建立一個代表客戶端處理物件建立的工廠類別。
回到我們的問題陳述,即有一個僅支持兩種動物(狗和貓)的系統,如果這個限制被消除並且我們的系統願意支持任何類型的動物怎麼辦?當然,我們的系統無法為數百萬隻動物提供實現。這就是工廠方法模式可以發揮作用的地方。
在工廠方法模式中,我們定義一個抽象類別或介面來創建對象,但不是由工廠負責對象的創建,而是將責任推遲到決定要實例化的類別的子類別。
Creator:Creator 是抽象類別或介面。它聲明了工廠方法,這是創建物件的方法。 Creator 提供了建立產品的接口,但沒有指定其特定類別。
具體造物主:具體造物主是造物主的子類。他們實作工廠方法,決定實例化哪個特定產品類別。換句話說,每個具體創造者都專注於創造特定類型的產品。
產品:產品是另一個抽象類別或介面。它定義了工廠方法創建的物件的類型。這些產品共享一個通用的接口,但它們的具體實現可能有所不同。
混凝土產品:混凝土產品是產品的子類。他們提供了產品的具體實現。每個特定產品對應於工廠方法所建立的一種類型的物件。
以下是我們的系統程式碼使用工廠方法模式的樣子:
第 1 步:定義產品
from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def make_sound(self): pass class Dog(Animal): def make_sound(self): print("Bhow Bhow!") class Cat(Animal): def make_sound(self): print("Meow Meow!")
第 2 步:建立混凝土產品
## client code if __name__ == '__main__': animal_type = input("Which animal should make sound Dog or Cat?") if animal_type.lower() == 'dog': Dog().make_sound() elif animal_type.lower() == 'cat': Cat().make_sound()
第三步:定義創作者
... ... class AnimalFactory: def make_sound(self, animal_type): return eval(animal_type.title())().make_sound()
第 4 步:實作具體創建者
## client code if __name__ == '__main__': animal_type = input("Which animal should make sound Dog or Cat?") AnimalFactory().make_sound(animal_type)
客戶可以使用以下解決方案:
from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def make_sound(self): pass
工廠方法模式解決方案允許客戶擴展系統並在需要時提供自訂動物實作。
解耦:將客戶端程式碼與具體類別解耦,減少依賴,增強程式碼穩定性。
靈活性:它帶來了很大的靈活性並使程式碼通用,而不是綁定到某個類別進行實例化。這樣,我們就依賴介面 (Product),而不是 ConcreteProduct 類別。
可擴充性:無需修改現有程式碼即可新增新的產品類,提倡開閉原則。
工廠方法設計模式提供了一種系統化的方法來建立對象,同時保持程式碼的可維護性和適應性。它在物件類型變化或演變的場景中表現出色。
框架、函式庫、外掛系統和軟體生態系統都受益於它的強大功能。它允許系統適應不斷變化的需求。
但是,應該謹慎使用它,考慮應用程式的具體需求和簡單性原則。如果應用得當,工廠方法模式可以對軟體系統的整體設計和架構做出重大貢獻。
編碼愉快! ! !
以上是了解工廠和工廠方法設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!