歡迎各位來到的設計模式進階篇。
延續了我們第十一天分享的 Singleton 與 MVC 入門設計模式,今天想進一步挑戰自己,學習 Factory(工廠模式)與 Observer(觀察者模式),看看如何在 Python 小程式中實際應用,讓寫出的程式更富有彈性與擴充性。
如果你曾經歷過以下痛苦:
那麼,今天的兩個模式就是為你準備的「程式碼解藥」!我們將學習的 Factory(工廠模式)和 Observer(觀察者模式)核心目標只有一個:讓程式碼達成軟體設計的最高標準——高內聚、低耦合。
今天就讓我們一起,讓程式碼從「一團亂麻」進化成「優雅的自動化系統」吧!
Factory 模式屬於創建型模式,簡單來說,它把「製造」東西的職責,從需要這些東西的人(客戶端程式碼)身上剝離出來,交給一個專業的「工廠」,會讓程式碼更專心於業務上。
它的關鍵優勢在於:它把具體產品的 new ConcreteClass() 邏輯封裝起來。也就是說當我們需要新增或修改產品時,只需要動 Factory 內部,所有呼叫 Factory 的客戶端程式碼都不用修改。
這就是我們追求的Decoupling解耦!
(1)定義類別
class Dog:
def speak(self):
return "Woof!"
class Cat:
def speak(self):
return "Meow!"
(2)工廠函式
def animal_factory(animal_type):
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
(3)使用工廠建立物件
pet = animal_factory("dog")
print(pet.speak())
元素 | 概念 / 職責 | 優點 |
---|---|---|
產品介面 (Product) | 定義所有產品的共同行為 | 提供統一接口,使用者不需了解實作細節 |
具體產品 (Concrete Product) | 實體的產品類別 | 容易擴充新產品類型,只需新增類別 |
工廠 (Factory) | 根據輸入參數,決定並創建對應的具體產品 | 封裝物件創建邏輯,程式碼更整潔;使用者只需指定類型,不需知道內部建構細節 |
Observer 模式屬於行為型模式。它定義了一種「一對多」的依賴關係,讓一個對象(主題)狀態改變時,所有依賴它的對象(觀察者)都能自動被通知並更新。
它的關鍵優勢在於:能將發布者與訂閱者徹底分離,實現極致的鬆散耦合。也就是說主題完全不需要知道誰在觀察它,或觀察者要做什麼。它只管發送通知。這讓你的程式碼可以輕鬆建立出「當 A 事件發生時,B、C、D 模組自動響應」的優雅事件驅動機制。常見於 UI 事件處理、數據流更新等場景。
(1)Subject 類別(被觀察者)
class Subject:
def __init__(self):
self.observers = []
def attach(self, observer):
self.observers.append(observer)
def notify(self, message):
for observer in self.observers:
observer.update(message)
class Observer:
def update(self, message):
print(f"Received message: {message}")
subject = Subject()
obs1 = Observer()
obs2 = Observer()
subject.attach(obs1)
subject.attach(obs2)
subject.notify("Hello Observers!")
Received message: Hello Observers!
Received message: Hello Observers!
元素 | 概念 / 職責 | 優點 |
---|---|---|
被觀察者 (Subject) | 保存觀察者清單,狀態改變時通知所有觀察者 | 物件之間低耦合,支援多個觀察者同時接收更新 |
觀察者 (Observer) | 定義接收通知的方法(如 update) | 可以獨立修改,增加或移除觀察者不影響被觀察者 |
通知機制 (Notify) | 當被觀察者狀態改變時,呼叫所有觀察者的 update 方法 | 適合事件驅動或即時通知場景,方便擴充和維護 |
我很喜歡這句話:"設計模式的價值,在於讓現在的你,寫出未來更容易維護的程式碼。"在實作的過程中,雖然腦袋偶爾像打結的線,但當整個架構慢慢成形,那份清晰與秩序感,讓我心裡充滿了踏實的溫暖。
祝福我們都能繼續在IT鐵人賽學習的路上越走越遠~