1.定義:單例模式,是一種常用的軟體設計模式,在它的核心結構中只包含一個被稱為單例的特殊類,通過單例模式可以保證系統中,一個類只有一個物件實體,
2.結構:

3.實作
1)餓漢模式:不管有沒有使用,物件都已經創建了;
1 // 餓漢式單例
2 public class Singleton {
3 // 私有構造
4 private Singleton() {}
5 // 餓漢模式物件從開始就已經創建了
6 private static Singleton single = new Singleton();
7 // 靜態工廠方法
8 public static Singleton getInstance() {
9 return single;
10 }
11 }
餓漢式單例在類加載初始化就創建好了一個靜態的物件供外部使用,除非系統重啟,這個物件不會改變,所以本身就是執行緒安全的,Singleton通過將構造方法限定為private避免了類在外部被實體化,在同一個虛擬機范圍內,Singleton的唯一實體只能通過getInstance()方法訪問,(事實上,通過Java反射機制是能夠實體化構造方法為private的類的,那基本上會使所有的Java單例實作失效)
2)懶漢模式:如果未呼叫,物件不會創建,只有被使用時,創建物件,
1 // 懶漢式單例(不考慮多執行緒情況)
2 public class Singleton {
3 // 懶漢模式物件在使用時才進行創建
4 private static Singleton instance ; // 將構造器私有化
5 private Singleton() {}
6 // 提供公開的方法獲取當前類的物件
7 public static Singleton getInstance() {
8 // 判斷物件是否存在,如果不存在new
9 if(instance==null) {
10 instance = new Singleton();
11 }
12 return instance;
13 }
14 }
該示例雖然用延遲加載方式實作了懶漢式單例,但在多執行緒環境下會產生多個single物件,
3)使用雙重校驗鎖實作
1 // 有同步鎖效果的懶漢模式
2 public class Singleton {
3 private static volatile Singleton instance = null;
4 private Singleton() {}
5 public static Singleton getInstance() {
6 // 雙重檢查
7 if (instance == null) {
8 // 相當于對getInstance()進行了同步鎖
9 synchronized (Singleton.class) {
10 if (instance == null) {
11 instance = new SingletonB();
12 }
13 }
14 }
15 return instance;
16 }
17 }
在方法上加synchronized同步鎖或是用同步代碼塊對類加同步鎖,此種方式解決了多個實體物件問題,使用雙重檢查進一步做了優化,可以避免整個方法被鎖,只對需要鎖的代碼部分加鎖,可以提高執行效率,
4.特點
i. 單例類只能有一個實體;
ii.單例類必須自己創建自己的唯一實體;
iii.單例類必須給所有其他物件提供這一實體;
5.優缺點
優點:
1)在記憶體里只有一個實體,減少了記憶體的開銷,尤其是頻繁的創建和銷毀實體(比如管理學院首頁頁面快取),
2)避免對資源的多重占用(比如寫檔案操作),
缺點:
沒有介面,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實體化,
6.適用環境
i.一個全域使用的類頻繁地創建或銷毀
ii.要求生產唯一序列號
iii.web中的計數器,不用每次重繪都在資料庫里加一次,用單例先快取起來
iv.創建的一個物件需要消耗的資源過多,比如IO與資料庫的連接等
v.在計算機系統中,執行緒池、快取、日志物件、對話框、列印機、顯卡的驅動程式物件常被設計成單例,這些應用都或多或少具有資源管理器的功能,每臺計算機可以由若干個列印機,但只能有一個Printer Spooler,以避免兩個列印作業同時輸出到列印機中,每臺計算機可以有若干通信埠,系統應當集中管理這些通信埠,以避免一個通信埠同時被兩個請求同時呼叫,
7.應用
通過單例模式實作唯一序列號效果,有一個類Singleton,有一個靜態屬性i,這個屬性從1開始,當呼叫sequence()方法時,自增1,模擬一個多執行緒效果,有10個執行緒呼叫Singleton類的sequence()方法,每個執行緒呼叫時,輸出當前序列號,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/35323.html
標籤:設計模式
