單例模式
-
初識:
單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一,
這種型別的設計模式屬于創建型模式,它提供了一種創建物件的最佳方式,
這種模式涉及到一個單一的類,該類負責創建自己的物件,同時確保只有單個物件被創建,
這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要實體化該類的物件,
-
注意:
-
單例類只能有一個實體,
-
單例類必須自己創建自己的唯一實體,
-
單例類必須給所有其他物件提供這一實體,
知識透析
-
意圖:
保證一個類僅有一個實體,并提供一個訪問它的全域訪問點,
-
主要解決:
一個全域使用的類頻繁地創建與銷毀,
-
何時使用:
當您想控制實體數目,節省系統資源的時候,
-
如何解決:
判斷系統是否已經有這個單例,如果有則回傳,如果沒有則創建,
-
關鍵代碼:
建構式是私有的,
-
應用實體:
-
一個班級只有一個班主任,
-
Windows 是多行程多執行緒的,在操作一個檔案的時候,就不可避免地出現多個行程或執行緒同時操作一個檔案的現象,所以所有檔案的處理必須通過唯一的實體來進行,
-
一些設備管理器常常設計為單例模式,比如一個電腦有兩臺列印機,在輸出的時候就要處理不能兩臺列印機列印同一個檔案,
-
-
優點:
-
在記憶體里只有一個實體,減少了記憶體的開銷,尤其是頻繁的創建和銷毀實體(比如管理學院首頁頁面快取),
-
避免對資源的多重占用(比如寫檔案操作),
-
-
缺點:
沒有介面,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實體化,
-
使用場景:
-
要求生產唯一序列號,
-
WEB 中的計數器,不用每次重繪都在資料庫里加一次,用單例先快取起來,
-
餓漢式
是否 Lazy 初始化:否
?
是否多執行緒安全:是
?
實作難度:易
?
描述:這種方式比較常用,但容易產生垃圾物件,
?
優點:沒有加鎖,執行效率會提高,
?
缺點:類加載時就初始化,浪費記憶體,
?
它基于 classloader 機制避免了多執行緒的同步問題,不過,instance 在類裝載時就實體化,
?
雖然導致類裝載的原因有很多種,在單例模式中大多數都是呼叫 getInstance 方法,
?
但是也不能確定有其他的方式(或者其他的靜態方法)導致類裝載,
?
這時候初始化 instance 顯然沒有達到 lazy loading 的效果,
單例實作
創建一個 SingleObject 類,
SingleObject 類有它的私有建構式和本身的一個靜態實體,
SingleObject 類提供了一個靜態方法,供外界獲取它的靜態實體,
使用 SingleObject 類來獲取 SingleObject 物件,

碼上行動
/** * 單例模式 * 回收站-餓漢式 * @Author Hateyes * @Date 2020-07-24 16:21 */ public class Trash { //靜態指向自身的參考 private static Trash instance = new Trash(); //餓漢式 public static Trash getInstance(){ return instance; } //構造私有 private Trash(){ } public static void main(String[] args){ //多執行緒場景實作 new Thread(){ public void run(){ Trash t = Trash.getInstance(); System.out.println(t); } }.start(); new Thread(){ public void run(){ Trash t = Trash.getInstance(); System.out.println(t); } }.start(); } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/121079.html
標籤:其他
上一篇:C++primer為啥這么難?
下一篇:自學Python編程經驗分享!
