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

懶漢式——執行緒不安全
是否 Lazy 初始化:是 是否多執行緒安全:否 實作難度:易 描述:這種方式是最基本的實作方式,這種實作最大的問題就是不支持多執行緒, 因為沒有加鎖 synchronized,所以嚴格意義上它并不算單例模式, 這種方式 lazy loading 很明顯,不要求執行緒安全,在多執行緒不能正常作業,
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
懶漢式——執行緒安全
是否 Lazy 初始化:是 是否多執行緒安全:是 實作難度:易 描述:這種方式具備很好的 lazy loading,能夠在多執行緒中很好的作業,但是,效率很低,99% 情況下不需要同步, 優點:第一次呼叫才初始化,避免記憶體浪費, 缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率, 注意:getInstance() 的性能對應用程式不是很關鍵(該方法使用不太頻繁),
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
碼上行動
/** * 單例模式 * 回收站-懶漢式 * @Author Hateyes * @Date 2020-07-24 16:36 */ public class RecycleBin { //靜態指向自身的參考 private static RecycleBin instance; //懶漢式 public static RecycleBin getInstance(){ if (instance != null){ return instance; } //安全性控制 synchronized (RecycleBin.class){ //需要增加該項控制 if (instance == null){ instance = new RecycleBin(); } } return instance; } //構造私有 private RecycleBin(){ } public static void main(String[] args) { //多執行緒場景實作 new Thread(){ public void run(){ RecycleBin r = RecycleBin.getInstance(); System.out.println(r); } }.start(); new Thread(){ public void run(){ RecycleBin r = RecycleBin.getInstance(); System.out.println(r); } }.start(); } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195066.html
標籤:其他
