最近看到一篇關于單例模式較為詳細的講解的文章:https://coolshell.cn/articles/265.html 下面對此文章進行摘錄 (Java)
// version 1.0 最為樸素的單例模式實踐; public class Singleton { private static Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { if (singleton== null) { singleton= new Singleton(); } return singleton; } }
singleton特點:
- 私有(private)的建構式,表明這個類是不可能形成實體了,這主要是怕這個類會有多個實體,
- 即然這個類是不可能形成實體,那么,我們需要一個靜態的方式讓其形成實體:getInstance(),注意這個方法是在new自己,因為其可以訪問私有的建構式,所以他是可以保證實體被創建出來的,
- 在getInstance()中,先做判斷是否已形成實體,如果已形成則直接回傳,否則創建實體,
- 所形成的實體保存在自己類中的私有成員中,
- 我們取實體時,只需要使用Singleton.getInstance()就行了,
singleton多執行緒版本優化:
// version 1.4 多執行緒強化版本,使用雙重檢查和 volatile 進行屏蔽多執行緒作用; public class Singleton { private volatile static Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { if (singleton== null) { synchronized (Singleton.class) { if (singleton== null) { singleton= new Singleton(); } } } return singleton; } }
// version 1.5 把類的創建委托給類裝載器來進行創建; public class Singleton { private volatile static Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } }
// version 1.6 使用私有內部類來進行隱藏,使得只有再getInstance 函式被呼叫的時候,類才會被闖將,使得類的創建可控; public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
使用上面三個版本進行創建,都可以保證執行緒安全;具體相關的議論,可以參考:https://coolshell.cn/articles/265.html
保持更新;更多內容請關注cnblogs.com/xuyaowen;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/35337.html
標籤:設計模式
上一篇:幾種常見設計模式在專案中的應用<Singleton、Factory、Strategy>
下一篇:JZ42 和為S的兩個數字
