設計模式入門:單例模式 Singleton Pattern

閱讀時間約 1 分鐘

在軟體開發中,有些時候我們需要確保某個類別在整個應用程式中只存在一個實例。例如當我們開發一個設定管理器時,需要保證在整個程式執行期間,所有的設定讀取和修改都要經由同一個物件。這時候單例模式就派上用場了。


什麼是單例模式?

單例模式是一種設計模式,用來確保一個類別在程式中只會有一個實例,並且提供一個全域性都能存取的方式。簡單來說就是你在應用程式的任何地方,拿到的都是同一個「唯一的」物件。


想像你有一個應用程式的設定管理器,用來儲存資料庫連線、檔案路徑、環境變數等設定。這些設定必須被全域存取,而且不應該隨意更動。單例模式就能確保這個管理器只有一個實例,避免因為多個實例而導致設定不一致的問題。


單例模式的應用場景

單例模式應用的場景很廣泛,例如:設定管理器用來管理應用程式的各種設定,確保每次存取的都是相同的設定資料。應用在日誌系統,集中處理應用程式中的日誌記錄,保證日誌記錄的一致性。或者應用在資源管理,比如資料庫連線或檔案系統的資源管理,確保資源的單一實例存取。


單例模式的優缺點

單例模式有個很大的優點,就是它能確保某個類別在整個應用程式中只有一個實例,這讓管理全域性資源變得簡單又有效。另外單例模式還能延遲實例化,也就是說只有當你第一次需要它時才會建立這個實例,節省了系統資源。


單例模式也有缺點,它是全域變數的狀態,這讓程式在多執行緒環境下同時執行時,可能會產生預期外的狀況,導致程式比較難測試和排除錯誤。另外單例模式讓一個類別承擔了太多責任,不僅要建立實例,還要管理它的狀態和行為,這有可能讓類別變得過於複雜。因此在使用單例模式時需要慎重考量,以避免後續維護困難。


總結一下,單例模式在需要確保唯一實例的場景中是一個強大而有效的工具,也需謹慎使用。它適合於設定管理器、日誌系統、資源管理等需要單一實例的情況。如果應用得當,單例模式可以幫助你保持程式的穩定性和一致性。


如果想要深入理解設計模式,可以參考我今年在iThome鐵人賽撰寫的文章。
https://ithelp.ithome.com.tw/articles/10347025

    avatar-img
    6會員
    83內容數
    對於經營自媒體、部落格或社群媒體感興趣?我專注於提供實用的寫作技巧、數位行銷策略,以及個人成長建議。 每週,我會分享提升寫作技巧、優化部落格經營、有效管理社群媒體、以及投資理財的寶貴知識。追蹤我,獲得實用的工具和建議,讓你的個人品牌和財務管理更上一層樓!
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    ShengYu的沙龍 的其他內容
    在資料分析的工作中,我們常常會遇到來自不同格式的資料,像是XML、CSV、或JSON。每種格式的資料都需要特定的處理方式,但其實無論資料格式如何,分析的流程大致上都是一樣的。這時候我們可以考慮用「樣板方法模式」來處理這些問題。 什麼是樣板方法模式? 簡單來說,樣板方法模式就是把一套固定的流程
    想像你在咖啡店點了一杯黑咖啡,但今天想要點不一樣的,所以你加了點牛奶,然後又加了點糖。這樣一來,原本單調的黑咖啡變得更加豐富、有層次,口感也不一樣了。在軟體開發中,我們有時也需要在不改變原來功能的前提下,為物件「加點料」,這就是裝飾者模式的精髓。 什麼是裝飾者模式? 裝飾者模式允許我們動態地
    今天你訂閱了喜歡的 YouTube 頻道。每當這個頻道上傳新影片時,你都會馬上收到通知,完全不需要主動去檢查頻道更新。在軟體開發中,我們常常需要處理類似的情況:當某個物件的狀態發生變化時,其他相關的物件會自動接收到通知,並做出相應的動作。這種場景正是可以運用觀察者模式 Observer Patter
    在開發程式時,我們常常會遇到需要根據不同情況選擇不同執行方式的需求。以檔案壓縮為例,市面上有很多種壓縮格式,每種格式都有其優點和用途。如果我們想要讓程式可以靈活地切換不同的壓縮方式,策略模式 Strategy Pattern 正是解決這類問題的工具。 策略模式的概念很簡單,就是把不同的「策略」或「
    當聽到「設計模式」這個詞時,可能會覺得這是什麼複雜的寫程式技術或者高深的專業知識。但實際上設計模式是一種能讓我們能夠寫出更好、更靈活程式的一套方法,不是專屬於高手的工具,反而是所有開發者都應該掌握的基礎。 什麼是設計模式? 設計模式其實是一組解決特定問題的經驗法則和最佳實踐。它們就像是軟體設計
    最近又被一個影片燒到,深受啟發,我稱它為「宇宙小點理論」,如果你總是很在意別人的看法,這理論你一定不能錯過。 在這個宏大的世界中,我們其實都是微不足道的小點, 當你用宏觀的視角來看待時,你會發現根本沒有人真的在乎你在做什麼。 無論你贏得了幾次奧運冠軍,還是賺了幾億的財富,或是創辦了
    在資料分析的工作中,我們常常會遇到來自不同格式的資料,像是XML、CSV、或JSON。每種格式的資料都需要特定的處理方式,但其實無論資料格式如何,分析的流程大致上都是一樣的。這時候我們可以考慮用「樣板方法模式」來處理這些問題。 什麼是樣板方法模式? 簡單來說,樣板方法模式就是把一套固定的流程
    想像你在咖啡店點了一杯黑咖啡,但今天想要點不一樣的,所以你加了點牛奶,然後又加了點糖。這樣一來,原本單調的黑咖啡變得更加豐富、有層次,口感也不一樣了。在軟體開發中,我們有時也需要在不改變原來功能的前提下,為物件「加點料」,這就是裝飾者模式的精髓。 什麼是裝飾者模式? 裝飾者模式允許我們動態地
    今天你訂閱了喜歡的 YouTube 頻道。每當這個頻道上傳新影片時,你都會馬上收到通知,完全不需要主動去檢查頻道更新。在軟體開發中,我們常常需要處理類似的情況:當某個物件的狀態發生變化時,其他相關的物件會自動接收到通知,並做出相應的動作。這種場景正是可以運用觀察者模式 Observer Patter
    在開發程式時,我們常常會遇到需要根據不同情況選擇不同執行方式的需求。以檔案壓縮為例,市面上有很多種壓縮格式,每種格式都有其優點和用途。如果我們想要讓程式可以靈活地切換不同的壓縮方式,策略模式 Strategy Pattern 正是解決這類問題的工具。 策略模式的概念很簡單,就是把不同的「策略」或「
    當聽到「設計模式」這個詞時,可能會覺得這是什麼複雜的寫程式技術或者高深的專業知識。但實際上設計模式是一種能讓我們能夠寫出更好、更靈活程式的一套方法,不是專屬於高手的工具,反而是所有開發者都應該掌握的基礎。 什麼是設計模式? 設計模式其實是一組解決特定問題的經驗法則和最佳實踐。它們就像是軟體設計
    最近又被一個影片燒到,深受啟發,我稱它為「宇宙小點理論」,如果你總是很在意別人的看法,這理論你一定不能錯過。 在這個宏大的世界中,我們其實都是微不足道的小點, 當你用宏觀的視角來看待時,你會發現根本沒有人真的在乎你在做什麼。 無論你贏得了幾次奧運冠軍,還是賺了幾億的財富,或是創辦了
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
    Thumbnail
    本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    ※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
    ※ 設計模式的五大精神介紹(S.O.L.I.D): ※ 第一大精神 — S:單一職責原則(Single responsibility principle, SRP) ※ 定義: 每個物件,不管是類別或函數,都應該只負責一項功能。 當需求改變時,僅需改相關的區域,而不需要更動其他不相關的部分
    Thumbnail
    先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
    所謂的多型是讓一個函式或是資料結構能擁有多個不同的類型,其中上一篇文章所談的就是參數多型(parametric polymorphism),這篇文章將繼續討論特設多型(ad hoc polymorphism)。特設多型跟泛型的差別在於:泛型函式對於所有的類型只能有一種實作,而特設多型會根據類型有不同
    Thumbnail
    本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
    Thumbnail
    本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    ※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
    ※ 設計模式的五大精神介紹(S.O.L.I.D): ※ 第一大精神 — S:單一職責原則(Single responsibility principle, SRP) ※ 定義: 每個物件,不管是類別或函數,都應該只負責一項功能。 當需求改變時,僅需改相關的區域,而不需要更動其他不相關的部分
    Thumbnail
    先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
    Thumbnail
    題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
    所謂的多型是讓一個函式或是資料結構能擁有多個不同的類型,其中上一篇文章所談的就是參數多型(parametric polymorphism),這篇文章將繼續討論特設多型(ad hoc polymorphism)。特設多型跟泛型的差別在於:泛型函式對於所有的類型只能有一種實作,而特設多型會根據類型有不同
    Thumbnail
    本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。