寫程式就像蓋房子,只會搬磚(寫功能)是不夠的,我們也許能快速搭起一間小木屋,但當專案逐漸龐大、需要多人協作時,沒有設計圖的房子很快就會出現裂縫,甚至無法再加蓋,而設計模式,是一套被反覆驗證的程式設計解決方案,就是那張「設計圖」,它不只是程式碼的寫法,更是一種思維方式,讓軟體架構更清晰、可維護性更高,且能讓我們少踩坑、少返工,並且寫出更堅實的程式。
做個Design Pattern(設計模式)的總結:
那今天我們就從兩個最經典的模式——單例模式與 MVC 模式來一探究竟。
簡潔地說明單例模式的核心特點為:確保一個類別在整個程式執行過程中,只有一個實例存在,並提供一個全域的存取點來取得這個唯一的實例。
舉個生活的例子的話就是:一個國家只會有一位總統;紀錄所有地方的日誌都應該放入同一個檔案等等。
好處是這樣的模式可以避免重複建立資源,減少不必要的浪費,並且確保程式在需要唯一控制核心的場景下能正常運作。
要實現單例模式,通常需要遵循以下幾個步驟:
私有化建構函式:將類別的建構函式設為 private,這樣就無法在類別外部直接使用 new 關鍵字來建立新的實例。
私有靜態實例:在類別內部建立一個私有的、靜態的變數,用來儲存這個唯一的實例。
公開靜態方法:提供一個公開的、靜態的方法(getInstance),這是外部程式唯一能取得該實例的途徑。在這個方法中,會檢查實例是否已經存在;如果不存在,就建立一個新的實例並儲存起來;如果已經存在,則直接回傳已有的實例。
(1)儲存唯一實例的私有類別變數
class Singleton:
__instance = None
**__instance **用來記錄這個類別的唯一實例,一開始是 None(還沒有建立)。
(2)靜態方法,作為全域存取點
@staticmethod
def get_instance():
if Singleton.__instance is None:
Singleton.__instance = Singleton()
return Singleton.__instance
get_instance() 是一個「全域入口」,只要呼叫這個方法,就能拿到同一個 Singleton 物件,並且外面不會直接用 Singleton() 來建立物件,而是透過這個方法來確保唯一性。
(3)私有化建構函式
def __init__(self):
if Singleton.__instance is not None:
raise Exception("這個類別只能有一個實例!請使用 get_instance() 方法。")
else:
print("Singleton 實例已建立!")
**init() **是建構子。
如果 instance 已經不是 None,就代表有人試圖亂用 Singleton() 建新的物件,直接拋出錯誤,強制阻止。
(4)取得實例、輸出
s1 = Singleton.get_instance()
s2 = Singleton.get_instance()
print(f"s1 is s2: {s1 is s2}")
這裡呼叫 get_instance(),第一次會建立一個新實例,第二次呼叫時,因為 instance 已經有值了,所以直接回傳同一個物件。
MVC 模式的核心特點為:將應用程式的邏輯分為三個互相獨立但又緊密協同的部分,它們各自負責不同的職責,這三部分為:Model、View、Controller,這使程式碼更容易理解、維護和擴充。
(1)模型(Model)
職責: 負責管理應用程式的資料和核心業務邏輯。它不關心資料如何被呈現,也不與使用者互動,只專注於處理資料的增、刪、改、查等操作。
(2)視圖(View)
職責: 負責呈現使用者介面,顯示來自模型的資料,而且它只負責「看」,不處理任何業務邏輯,也不直接和模型互動,當資料變動時,視圖會被通知去更新顯示。
(3)控制器(Controller)
職責:作為模型和視圖之間的橋樑,處理使用者輸入,並協調模型的變化和視圖的更新,是整個流程的指揮中心。
透過今天的學習:單例模式與 MVC 模式,我不僅認識了設計模式的實用性,也看見了程式設計中思維模式的重要性。
這兩種模式一個從點--物件實例出發,一個從面--整體架構著手。
單例模式告訴我:有些問題其實只需要一個精簡的解答,就能發揮最大效益;而 MVC 模式則提醒我:當系統日益龐大時,好的架構設計能帶來長遠的穩定與效率。
設計模式就像工具箱裡的專業工具,學會了不代表要時時刻刻用,但在遇到合適的場景時,就能發揮事半功倍的效果。
未來我也希望能持續探索更多設計模式,並在實際專案中靈活運用,讓程式不只是能跑,更能跑得漂亮。