單例設計模式的幾種常見實現方法

2021-07-03 08:27:39 字數 2637 閱讀 8269

總結

單例可以說是gof23中最簡單的一種設計模式,也經常用到。比如window的任務管理器,比如servlet物件等等。

單例要完成的就是確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個唯一的例項。就像它的定義:

ensure a class has only one instance, and provide a global point of access to it.

最近學習整理了一下常見的單例模式實現方法(因為我見過的也不多,所以暫且認為我見過的就是常見的吧哈),大概有這麼6種。

實現單例就是要讓物件在整個系統中是唯一的,不能被隨意的例項化。還要考慮像執行緒安全問題,延遲載入問題等,就要看其具體的使用環境了。

懶漢式、餓漢式、雙重檢查鎖、靜態內部類、列舉、單例工廠和防範措施,**放在我的github的設計模式倉庫中。

話不多說,上栗子。

/**

* 懶漢式

* @author liu

* 類初始化時不初始化這個物件,延時載入,真要用時再載入

*/

public

class

singletondeom1

//方法有同步,效率略低

public

synchronized singletondeom1 getinstance()

return instance;

}}

/**

* 餓漢式

* @author liu

* 類載入時立即初始化這個物件,類載入執行緒安全,沒有延時載入

*/

public

class

singletondemo2

//沒有同步,效率略高

public singletondemo2 getinstance()

}

/**

* 雙重檢查鎖

* @author liu

* 同步快在if內部,第一次同步,之後不用同步。

* jvm底層實現的問題,有時執行順序會出問題。

* 比懶漢式略提高。

*/

public

class

singletondemo3 }}

instance = demo;}}

return instance;

}private

singletondemo3()

}

/**

* jvm保障列舉單例和執行緒安全,但無延時載入。

* @author liu

* */

public enum singletondemo5

}

是jvm直接罩著的,用起來比較方便。

/**

* 靜態內部類形式

* @author liu

* 不會立即載入,呼叫get才會載入內部類,載入類是執行緒安全的,延時載入又執行緒安全。

*/public class singletondemo4

private static class instance

public singletondemo4 getsingletondemo4()

}

加強版懶漢式,是比較好用的一種。

/**

* 單例類

* @author liu

* 要建立這個單例類的單例物件

*/public class singletondemo7_1

public void dosomething()

}/**

* 用工廠方法實現單例

* @author liu

* 當然要通過正常的渠道,其他類通過反射也是可以獲得單例類的其他物件的。

*/public class singletondemo7_2 catch(exception e)

}public singletondemo7_1 getsingletondemo7_1()

}

借助了工廠模式,單例工廠只產生同乙個單例物件。

如果是架構級的,還要考慮防範通過非正常渠道,比如反射、反序列化方法獲取物件,以懶漢式為例。

/**

* 防止反射和反序列化破壞

* @author liu

* */

public class singletondemo6

}//反序列化時,有readresolve方法,則直接返回此方法指定的物件,而不建立新的物件。

private object readresolve()

public synchronized singletondemo6 getsingletondemo6()

return instance;

}}

當全域性只需要乙個且只能有乙個物件的時候就用單例嘍。簡單說就是通過構造方法的私有化,不讓別人隨意建立新的物件,而是用自己建立好的唯一的物件提供給物件的呼叫者。

至於對是否延遲載入、執行緒安全和特殊情況的防範,就要看使用的具體環境了。當然,如果需要的話也可以從單例模式擴充套件為多例。

最後thanks for 《設計模式之禪》(秦小波 著)

單例設計模式的幾種實現方法

author lais public class ehansingle 私有化靜態物件,並直接建立,強調單例時可以用final修飾 private final static ehansingle single new ehansingle 提供外界獲取方式 public static ehansin...

幾種常見的單例模式

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些...

設計模式 單例模式的幾種實現方式

1.概述 單例模式 簡單的說就是可以確保只產生乙個類例項,讓多個使用者或者多個執行緒同時使用這乙個例項,而不需要每次使用都建立一次物件。2.優缺點和適用場景 3.幾種不同形式的單例模式 class singleclass public static singleclass getinstance 這...