設計模式《二》單例模式

2021-08-13 17:30:22 字數 2622 閱讀 1270

確保乙個類有且僅有乙個例項,並且提供乙個全域性的訪問點。

通俗地說就是,物件只能生成乙個,並且生成該物件的方法只有乙個。

單例模式的使用是為了只產生乙個例項,從產生乙個例項的原因及作用來看

1.對頻繁生成銷毀的類避免了資源的浪費。

2.達到了不同執行緒之間的資料共享。

單例模式的經典實用,比如windows的**站,任務管理器,又比如避免資料庫連線產生的大量開銷,日誌類檔案、網頁計數器的資料共享...等等之類

單例模式寫法有多種,單論思想實現來說分為以下幾種

懶漢等吃,餓漢找吃,懶漢就是在用到的時候載入例項,實現懶載入。

其中有兩種懶漢的寫法,區別只是是否對getinstance方法加鎖來實現在多執行緒下的單例。

/**

* @classname: singleton

* @description: 懶漢單例模式

* @author cjd

* @date 2023年12月18日 上午11:03:26

*/public class singleton

public static synchronized singleton getinstance()

return instance;

}}

當懶漢不加鎖時,多執行緒下是完全不能使用的,而當懶漢加鎖後,時間更進一步地被浪費,在此情況下也就出現了再後面的雙重校驗鎖單例。

餓漢與懶漢的差別是餓漢在使用前已經被虛擬機器裝載過並生成了唯一的例項。

/**

* @classname: singleton

* @description: 餓漢單例模式

* @author cjd

* @date 2023年12月18日 上午11:03:26

*/public class singleton

public static synchronized singleton getinstance()

}

也同時因為類載入初始化例項的方式避免了因加鎖產生的開銷,對此和懶漢相比付出了空間,獲得了時間。

其在寫法上取出了對執行緒的鎖及例項為空判斷,因為類載入的時候就已經例項化了。

以及另一種通過靜態**塊只執行一次初始化的相似方法,了解一下即可。

/**

* @classname: singleton

* @description: 餓漢單例模式

* @author cjd

* @date 2023年12月18日 上午11:03:26

*/public class singleton

private singleton() {}

public static synchronized singleton getinstance()

}

此寫法是為了解決在多執行緒環境下因懶漢模式的懶載入上鎖產生大量的時間開銷。

/**

* @classname: singleton

* @description: 雙重校驗鎖單例模式

* @author cjd

* @date 2023年12月18日 上午11:03:26

*/public class singleton

public static singleton getinstance()

}} return instance;

}}

就寫法和第一種懶漢單例進行比較,在getinstance()方法內部對物件進行了兩次非空判斷,節約了大量上鎖的時間開銷。

因為jvm在instance=new singleton()的時候經歷了3個步驟

1.為物件分配記憶體

2.初始化例項物件

3.把引用instance指向分配的記憶體空間

如果在jvm優化後的順序為1,3,2 ,當執行緒1進入new singleton(),先執行了3,instance已經不為null了。

此時執行緒2進入判斷instance不為null,返回instance導致程式報錯。

靜態內部類的實現即將內部類及內部類私有

這樣寫的好處在於同樣實現了懶載入

public class singleton 

private static class singletonholder

public static singleton getinstance()

}

列舉法則一直沒有這樣的問題,而且更加簡潔,為什麼簡潔,以下是**

/**

* @classname: singleton

* @description: 列舉單例模式

* @author cjd

* @date 2023年12月18日 上午11:03:26

*/public enum singleton

呼叫方法也很簡單,singleton.instance;

單例模式的濫用同樣會產生很大的問題,設計時也不能一昧地為了節約資源開銷而使用單例。

同時也因為反射的機制存在,可能會產生多個單例物件的情況,應盡量避免使用反射建立單例。

設計模式 二 單例模式

建立乙個物件並不難,但當我們不得不為每新新增一種抽象類或介面而到處修改客戶 時,就不得不思考直接使用new建立物件帶來的高耦合。建立型別的模式將使用物件和 例項化物件 進行了分離。建立型別模式包括 單例模式 工廠方法模式 原型模式。下面先看單例模式 單例模式 保證乙個類在系統裡只有乙個例項化物件。應...

設計模式(二) 單例模式

單例模式 用來建立只能有乙個例項的物件。確保乙個類只有乙個例項,並提供乙個全域性訪問點。有的時候我們不希望乙個類被建立出多個物件,因為多個例項會帶來許多不好的影響。經典單例模式 public class singleinstance public static singleinstance geti...

設計模式(二)單例模式

單例模式 保證只有乙個物件,每次獲取物件獲取到的都是同乙個物件。單例模式是我們程式中最常見的設計模式,很多任務具類都設計成單例模式,spring中的bean也有單例,單他不是真正的單例。單例模式總結下來有幾種寫法,他們共性就是私有的構造方法。package com.designpattern.sin...