iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
Software Development

軟體開發養成計畫:以小程式實作深化開發能力系列 第 11

[Day11]實戰設計模式:掌握程式架構的基石——單例模式與 MVC

  • 分享至 

  • xImage
  •  

前言:設計模式是什麼?為什麼要學?

寫程式就像蓋房子,只會搬磚(寫功能)是不夠的,我們也許能快速搭起一間小木屋,但當專案逐漸龐大、需要多人協作時,沒有設計圖的房子很快就會出現裂縫,甚至無法再加蓋,而設計模式,是一套被反覆驗證的程式設計解決方案,就是那張「設計圖」,它不只是程式碼的寫法,更是一種思維方式,讓軟體架構更清晰、可維護性更高,且能讓我們少踩坑、少返工,並且寫出更堅實的程式。
做個Design Pattern(設計模式)的總結:

  • 定義:設計模式是前人解決常見問題所歸納出的「最佳實踐」。
  • 好處:它們能讓程式碼更穩定、更好維護,也讓團隊協作更有效率。

那今天我們就從兩個最經典的模式——單例模式與 MVC 模式來一探究竟。

1.Singleton Pattern(單例模式)

簡潔地說明單例模式的核心特點為:確保一個類別在整個程式執行過程中,只有一個實例存在,並提供一個全域的存取點來取得這個唯一的實例。
舉個生活的例子的話就是:一個國家只會有一位總統;紀錄所有地方的日誌都應該放入同一個檔案等等。
好處是這樣的模式可以避免重複建立資源,減少不必要的浪費,並且確保程式在需要唯一控制核心的場景下能正常運作。

單例模式的實現要素

要實現單例模式,通常需要遵循以下幾個步驟:

  • 私有化建構函式:將類別的建構函式設為 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 已經有值了,所以直接回傳同一個物件。

2.MVC Pattern(模型-視圖-控制器)

MVC 模式的核心特點為:將應用程式的邏輯分為三個互相獨立但又緊密協同的部分,它們各自負責不同的職責,這三部分為:Model、View、Controller,這使程式碼更容易理解、維護和擴充。

各個組件的職責

(1)模型(Model)
職責: 負責管理應用程式的資料和核心業務邏輯。它不關心資料如何被呈現,也不與使用者互動,只專注於處理資料的增、刪、改、查等操作。
(2)視圖(View)
職責: 負責呈現使用者介面,顯示來自模型的資料,而且它只負責「看」,不處理任何業務邏輯,也不直接和模型互動,當資料變動時,視圖會被通知去更新顯示。
(3)控制器(Controller)
職責:作為模型和視圖之間的橋樑,處理使用者輸入,並協調模型的變化和視圖的更新,是整個流程的指揮中心。

MVC 運作流程

  • (1)使用者操作視圖(View):使用者在畫面上互動。
    例如:點擊「送出」按鈕、填寫表單或選擇選項。
    重點:使用者只看到畫面,並不直接操作資料。
  • (2)控制器(Controller)接收請求:控制器負責監聽使用者的操作事件,並決定接下來的流程。
    例如:使用者按下「送出」後,控制器會收到這個事件。
  • (3)控制器更新模型(Model):控制器將使用者的操作轉換成資料處理指令,告訴模型去做相應動作。
    例如:將使用者填寫的新資料儲存到資料庫中。
  • (4)模型處理資料:模型執行業務邏輯。
    例如:新增、更新或計算資料,完成後,模型會發出通知。
  • (5)視圖更新:視圖接收到通知,向模型取得最新資料,重新渲染畫面,使用者就可以看到資料變更後的結果。
    我們用一句話總結就是:使用者 → 視圖 → 控制器 → 模型 → 視圖更新 → 使用者看到結果
    整個流程像是一個循環,確保畫面與資料保持同步,又把程式碼的責任分得清楚。

3.設計模式初探心得:從單例到 MVC

透過今天的學習:單例模式與 MVC 模式,我不僅認識了設計模式的實用性,也看見了程式設計中思維模式的重要性。
這兩種模式一個從點--物件實例出發,一個從面--整體架構著手
單例模式告訴我:有些問題其實只需要一個精簡的解答,就能發揮最大效益;而 MVC 模式則提醒我:當系統日益龐大時,好的架構設計能帶來長遠的穩定與效率。
設計模式就像工具箱裡的專業工具,學會了不代表要時時刻刻用,但在遇到合適的場景時,就能發揮事半功倍的效果。
未來我也希望能持續探索更多設計模式,並在實際專案中靈活運用,讓程式不只是能跑,更能跑得漂亮。


上一篇
[Day10]為什麼大家都在學網頁爬蟲?你該知道的基礎觀念
下一篇
[Day12]從紙上遊戲到程式實作:Python 版井字遊戲
系列文
軟體開發養成計畫:以小程式實作深化開發能力17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言