摘要:一概念一般采用單例模式就是為了滿足只創建一個類的需要。單例模式有兩個特點一個類僅有一個實例僅有一個全局訪問點二寫法餓漢式所謂餓漢式,是指這個類的實例在類加載階段就已經創建出來了。使用在對象被使用時才實例化枚舉式
一、概念
一般采用單例模式就是為了滿足“只創建一個類”的需要。
單例模式有兩個特點:
(1)一個類僅有一個實例
(2)僅有一個全局訪問點
1、餓漢式
所謂餓漢式,是指這個類的實例在類加載階段就已經創建出來了。
public class Singleton1 { //在類的內部實例化一個實例 private static final Singleton1 instance = new Singleton1(); //隱藏構造方法 private Singleton1() { } //對外開放一個獲取實例的方法 public static Singleton1 getInstance(){ return instance; } }
當然也可以使用static代碼塊。(注意這里的final,看網上有各種寫法,加或者不加的都有,我認為這里可以加,這樣getInstance方法里就不需要判空了)
這種方式雖然能夠有效避免線程安全的問題,但是卻可能造成不必要的浪費,因為也許這個實例并不需要用到,或者就用到一兩次,卻要一直占用內存。
2、靜態內部類
public class InnerClassSingleton { //在靜態內部類中實例化對象 private static class SingletonHolder{ private static final InnerClassSingleton instance = new InnerClassSingleton(); } //隱藏構造方法 private InnerClassSingleton(){ } //對外提供訪問方法 public static final InnerClassSingleton getInstance() { return SingletonHolder.instance; } }
3、懶漢式
所謂懶漢式,就是在使用時才加載,比較“懶一些”。
public class Singleton2 { private static Singleton2 instance; private Singleton2(){ } public static Singleton2 getInstance(){ //在對象被使用時才實例化 if (instance == null) instance = new Singleton2(); return instance; } }
注意:加上synchronized關鍵字就可以保證線程安全。
public class Singleton2 { private static Singleton2 instance; private Singleton2(){ } public static synchronized Singleton2 getInstance(){ //在對象被使用時才實例化 if (instance == null) instance = new Singleton2(); return instance; } }
4、當然上述方式效率比較低,因為synchronized鎖的范圍太大了
public class Singleton2 { private static Singleton2 instance; private Singleton2(){ } public static Singleton2 getInstance(){ //在對象被使用時才實例化 synchronized (Singleton2.class){ if (instance == null) instance = new Singleton2(); return instance; } } }
這樣就縮小了鎖的范圍,但是這種方式依然存在問題,因為Java內存模型的機制,程序可能會崩潰,因此就要用到volatile。
5、使用volatile
public class Singleton2 { private static volatile Singleton2 instance; private Singleton2(){ } public static Singleton2 getInstance(){ //在對象被使用時才實例化 if (instance == null){ synchronized (Singleton2.class){ if (instance == null) instance = new Singleton2(); return instance; } } } }
6、枚舉式
public enum Singleton3 { INSTANCE; Singleton() { } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75285.html
摘要:單例模式單例模式就是保證一個類僅有一個實例并提供一個訪問它的全局訪問點其最大的特點就是永遠只返回一個實例實例通過來獲取類的唯一對象其缺點也明顯增加了類的不透明性透明的單例模式最終會被返回使用代理實現單例模式將負責管理單例的邏輯移到了代理類中 單例模式 單例模式 就是保證一個類僅有一個實例, 并提供一個訪問它的全局訪問點. 其最大的特點就是 永遠只返回一個實例 var Sin...
摘要:在設計模式中,所有的設計模式都遵循這一原則。其實就是說在應用程序中,所有的類如果使用或依賴于其他的類,則應該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設計模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎教程的筆記講的賊好,附上傳送門 傳智風清揚-超全面的Java基礎 一、面向對象思想設計原則 1.單一職責原則 其實就是開發人員經常說的高...
摘要:設計模式學習裝飾器模式這個在我的筆記中有介紹工廠模式未完成,待更新單例模式保證一個對象最多只有一個實例存在。對安全性要求較高的場景,比如銀行的修改余額業務。如果我們不使用單例模式,那么就會創建三個不同的實例。 設計模式學習 1.裝飾器模式 這個在我的筆記中有介紹 2.工廠模式 author : liibntime :2018-11-6未完成,待更新 3.單例模式 保證一個對象最多只有一...
摘要:今天上課的時候老師開始講個設計模式,為加深印象,特開一篇文章來做記錄。其中參考大話設計模式以及上課的例子,后期會補充關于的應用保證一個類僅有一個實例。單例是有狀態的,允許子類繼承,擁有唯一的對象實例。原始對象與副本引用同一對象。 今天上課的時候老師開始講23個設計模式,為加深印象,特開一篇文章來做記錄。其中參考《大話設計模式》以及上課的例子(java),后期會補充關于js的應用 ...
摘要:今天上課的時候老師開始講個設計模式,為加深印象,特開一篇文章來做記錄。其中參考大話設計模式以及上課的例子,后期會補充關于的應用保證一個類僅有一個實例。單例是有狀態的,允許子類繼承,擁有唯一的對象實例。原始對象與副本引用同一對象。 今天上課的時候老師開始講23個設計模式,為加深印象,特開一篇文章來做記錄。其中參考《大話設計模式》以及上課的例子(java),后期會補充關于js的應用 ...
閱讀 1535·2021-09-22 15:35
閱讀 2014·2021-09-14 18:04
閱讀 884·2019-08-30 15:55
閱讀 2458·2019-08-30 15:53
閱讀 2685·2019-08-30 12:45
閱讀 1209·2019-08-29 17:01
閱讀 2584·2019-08-29 15:30
閱讀 3521·2019-08-29 15:09