單例的注意事項,應用場景(僅做本人記錄使用)

單例模式介紹:

單例模式(Singleton),也叫單子模式,是一種經常使用的軟件設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統只須要擁有一個全局對象,這樣有利於咱們協調系統總體的行爲。數據庫

好比在某個服務器程序中,該服務器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,而後服務進程中的其餘對象再經過這個單例對象獲取這些配置信息。這種方式簡化了在複雜環境下的配置管理。設計模式

單例模式實現思路:

  • 一個類能返回對象一個引用(永遠是同一個)和一個得到該實例的方法(必須是靜態方法,一般使用getInstance這個名稱);安全

  • 調用這個方法時,若是類持有的引用不爲空就返回這個引用,若是類保持的引用爲空就建立該類的實例並將實例的引用賦予該類保持的引用;服務器

  • 將該類的構造函數定義爲私有方法,這樣其餘處的代碼就沒法經過調用該類的構造函數來實例化該類的對象,只有經過該類提供的靜態方法來獲得該類的惟一實例。多線程

須要注意的地方:

單例模式在多線程的,應用場合下必須當心使用。若是當惟一實例還沒有建立時,有兩個線程同時調用建立方法,那麼它們同時沒有檢測到惟一實例的存在,從而同時各自建立了一個實例,這樣就有兩個實例被構造出來,從而違反了單例模式中實例惟一的原則。函數

解決這個問題的辦法是爲指示類是否已經實例化的變量提供一個互斥鎖(雖然這樣會下降效率)。工具

使用注意事項:

  1. 使用時不能用反射模式建立單例,不然會實例化一個新的對象性能

  2. 使用懶單例模式時注意線程安全問題spa

  3. 餓單例模式和懶單例模式構造方法都是私有的,於是是不能被繼承的,有些單例模式能夠被繼承(如登記式模式)線程

適用場景:

單例模式只容許建立一個對象,所以節省內存,加快對象訪問速度,所以對象須要被公用的場合適合使用,如多個模塊使用同一個數據源鏈接對象等等。如:

  • 須要頻繁實例化而後銷燬的對象。

  • 建立對象時耗時過多或者耗資源過多,但又常常用到的對象。

  • 有狀態的工具類對象。
    -頻繁訪問數據庫或文件的對象。

如下都是單例模式的經典使用場景:

  1. 資源共享的狀況下,避免因爲資源操做時致使的性能或損耗等。如上述中的日誌文件,應用配置。

  2. 控制資源的狀況下,方便資源之間的互相通訊。如線程池等。

相關文章
相關標籤/搜索