小伙的java之旅 GOF23 單例模式

2021-07-28 06:18:35 字數 1819 閱讀 6173

核心作用:保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。
餓漢式:

/**

* 單利模式:餓漢式載入

* 餓漢單例模式**中,static變數會在類裝載時初始化,此時也不會涉及多個執行緒物件訪問物件的問題。虛擬機器保證只會裝載一次該類,肯定不會發生併發訪問的問題。

* 因此,可以省略synchronized關鍵字

* 問題:如果只是載入本類,而不是要呼叫getinstance(),甚至永遠沒有呼叫,則會造成資源浪費。

* @author zw**/

public class hungryload

//方法沒有同步,呼叫效率高。

public static hungryload getinstance()

}

懶漢式

/**

* 單例模式:懶漢式載入

* 延遲載入,懶載入!真正用的時候才載入。

* 問題:資源利用率高了。但是每次呼叫getinstance()方法都要同步,併發效率較低。

* @author zw

* */

public class lazyload

}//方法同步,呼叫效率低。

public static synchronized lazyload getinstance()

return instance;

}}

靜態內部類

/**

* 單例模式:靜態內部類(也是一種懶載入)

* 外部類沒有static屬性,則不會像餓漢式那樣立即載入物件。

* 只有真正呼叫getinstance(),才會載入靜態內部類,載入類時是執行緒安全的。instance是static final 型別,保證了記憶體中只有這樣乙個例項存在,

* 而且只能被賦值一次,從而保證了執行緒安全性。

* 兼備了併發高效呼叫和延遲載入的優勢!

* @author zw

* */

public class staticinnerclassload

private staticinnerclassload()

public static staticinnerclassload getinstance()

}

列舉

/**

* 單例模式:列舉載入

* 實現簡單

* 列舉本身就是單例模式,由jvm從根本上提供保障!避免通過反射和反序列化的漏洞!

* 問題:無延遲載入。

* @author zw

* */

public enum enumload

}

開發時,如果類建立物件的代價很高,就用延時載入(懶漢式);類呼叫效率非常頻繁,用餓漢式

單例物件:占用 資源少;不需要延時載入。

列舉式 好於 餓漢式

單例物件:占用 資源大;需要延時載入。

靜態內部類式 好於 懶漢式

防止通過反射建立多個物件,在構造方法中加

if (instance != null)

單例模式應用的場景一般發現在以下條件下:

(1)資源共享的情況下,避免由於資源操作時導致的效能或損耗等。如上述中的日誌檔案,應用配置。

(2)控制資源的情況下,方便資源之間的互相通訊。如執行緒池等。

GOF23之單例模式

單例模式是gof23中最簡單的模式。單例的設計模式裡的出場率很高,它簡單但也有多種實現方式,也正是因為它的靈活性和重要性使喚其多次出現在面試筆試中,經常與工廠模式搭配使用。作用 保證乙個類只能有乙個例項。多次建立只會返回同乙個例項。作用範圍 如word中的工具箱,任何時候只能有乙個工具箱。大話設計模...

GoF23 單例(Singleton)模式

目標之一 提高程式的可復用性 有哪些功能可以被擴充套件?擴充套件功能時必須修改哪些地方?有哪些類不需要修改?保證在jvm中只有乙個例項。需要該物件時,new例項物件。不安全 class singleton 當需要時才例項化,之後都是乙個例項。懶漢式不安全,所以需要加上同步。return public...

GOF23 單例模式(1)

核心作用 保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。常見的應用場景 1.windows的task manager 任務管理器 2.windows的recycle bin 站 3.專案中,讀取配置檔案的類,一般也只有乙個物件,沒有必要每次使用配置檔案資料,每次new乙個物件去讀取。...