# 六角鼠年鐵人賽 Week 34 - Design Pattern - Singleton Method ==大家好,我是 "為了拿到金角獎盃而努力著" 的文毅青年 - Kai== ## Florence Nightingale :::info I attribute my success to this - I never gave or took any excuse. ::: ## 前言 正如我先前所說,接下來的文章會不定主題的更新 Design Pattern、Algorithm 的學習心得,甚至最近因為工作上專案的關係,又學到了如何做 SpringBoot JPA 的 Multi-DB connection 的皮毛,都很想盡快有個時間可以分享給大家... (加班Loop ORZ)。 總之只要有空、人也休息夠,就會盡量把我所學到的都記錄在這裡,幫助我自己的同時也幫助所有其他的工程師們~ ## 主題 這次要介紹的 Singleton 模式,恰如英文翻譯「獨身」,亦即為在整個程式運行的過程中,該物件只會有單一個實體,並且會提供一個 static 方法讓其可以被統一的呼叫使用。 中文常見名稱 **單例模式 (單實體模式)** 例如: 大多數的系統只需要一份設定文件,在全局思考的狀況下就會是: 一個類別讀取並保存了該文件的設定值後,其他類別只需要來呼叫使用即可,不需要再展開一個、兩個同樣都是讀取同份文件的類別。 例如: 處理資料庫的 DAO 類別,同時間只能有一個實體存在,就算多執行緒的狀況下也要排隊等候。 例如: 應用程式只允許在一個裝置內部被啟動一個 (Windows Task服務)。 諸如上述多種應用方式。 ## 實行方式 ```java= public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` Singleton 設計的方式有很多,個人喜歡採用上述這種方式,符合 Lazy-Loading 的方式,在系統運行時,並不會建立實體,而是當 getInstance() 被呼叫時,該類別才第一次進行實體化,並且在進行實體化的過程中,僅能有單一線程執行,避免了多線程不安全的問題。 ## Enum 方式的最佳解 ENUM 的特性是 Class Loading 的時候創建、物件修飾為 public static final、支援序列化、防止反序列化重建物件、支持多執行緒同步等諸多優點於一身,就是那個邏輯容易讓人想不到。 ```java= public enum Singleton{ INSTANCE ; public void method1(){...} public Object<?> method2(){...; return Object<?>()} } ``` :::danger Singleton 也是基本設計模式之一,但在瀏覽了網路上各式各樣的寫法後還是有一種只見冰山不見底的感覺。路還很長! 期許能夠繼續學習下去! 下一篇跟大家分享 Liskov Substitution Principle [六角鼠年鐵人賽 Week 35 - Design Pattern - Liskov Substitution Principle](/eALIi-5ORfeznmWRK0ftng) ::: 首頁 [Kai 個人技術 Hackmd](/2G-RoB0QTrKzkftH2uLueA) ###### tags: `Design Pattern`,`w3HexSchool`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up