設計模式之單例模式(建立型)

2021-10-08 19:18:39 字數 1934 閱讀 4612

單例模式的核心,就是全域性只有乙個例項。下面就每一種建立方式分析其優缺點。

1.餓漢式

/**

* 餓漢式

*/public class personhungry

public static personhungry getinstance()

}

2.靜態**塊
public class person     

private person() {}

public static person getinstance()

}

靜態**塊其實相當於另外一種餓漢式,類載入的時候,物件就會建立,雖說執行緒安全,但是資源浪費。

3.懶漢式1和2

public class personlazy1 

/*** 該方式在多執行緒執行下,例項不唯一

*/public static personlazy1 getinstance()

return minstance;

}}

public class personlazy2 

/*** 耗效能

*/public synchronized static personlazy2 getinstance()

return minstance;

}}

懶漢式1,在多執行緒的情況下,沒法保證只建立乙個例項物件。所以演變出懶漢式2,這種方式從效果的角度是可以實現單例的,通過synchronized保證了多執行緒的安全性。但是,懶漢式2最大的缺點就是耗效能,不管是否已經建立了例項,每次呼叫getinstance都需要鎖。

4.懶漢式3和4

public class personlazy3 

/*** 改進效能,雙重判斷

*/public static personlazy3 getinstance()

}} return minstance;

}}

/**

* 推薦使用的方式

*/public class personlazy4

/*** 改進效能,雙重判斷

*/public static personlazy4 getinstance()

}} return minstance;

}}

5.靜態內部類(推薦使用的方式)
public class personstatic 

public static personstatic getinstance()

/*** 靜態內部類

*/private static class personstaticholder

}

其實現原理和餓漢式差不多,解決了餓漢式載入類就載入的問題,因為外部類personstatic載入時,其內部類personstaticholder是不會隨著載入的。當第一次執行getinstance時,執行到personstaticholder.instance時,personstaticholder類才開始被載入。其實不管多少個執行緒去呼叫getinstance方法,返回的都是第一次呼叫時建立的物件。這種方法不僅能保證了執行緒的安全性,也保證單例的唯一性,同時也延遲了單例的例項化。

缺點:假如personstatic建立時需要傳入乙個引數,比如context,那麼這種方式實現的單例是不支援。

6.列舉

1、定義乙個需要單例的person類

2、定義列舉類,用於儲存person類物件

public enum personenum 

public person getperson()

}

3、呼叫

public class test 

}

設計模式 建立型 單例模式

單例模式在整個軟體開發中還是比較常用的,頻繁使用且過程穩定的方法 全域性變數都可以使用該模式,也可以叫做公共類。單例模式需要遵循要麼出現一次,要麼不出現的規則。單例模式不提供外部例項化功能,在內部自已例項化以保證其唯一例項。具體如下 class common public static common...

設計模式 建立型 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式劃分 class singleton 獲取本類例項的唯一全域性訪問點 public static singleton getinstance return instance 物件屬於引用資料型別,和基本資料...

設計模式 建立型 單例模式

英文singleton,又稱單件模式。描述 確保類只有乙個例項,並且提供了乙個全域性訪問點。在應用的某些場景,我們只需要類的乙個例項就夠了,並且我們需要在應用的多個地方 客戶 方便的獲取該例項物件。比如應用中的乙個浮動工具欄,或者是乙個資訊收集器 專門收集應用中的操作資訊 等等。優點 方便的控制僅唯...