設計模式-Singleton 單例模式

單例模式的概念:

單例模式的意思就是隻有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。這個類稱爲單例類。


關鍵點:

1)一個類只有一個實例       這是最基本的

2)它必須自行創建這個實例

3)它必須自行向整個系統提供這個實例

----------------------------------------------------------------------------------------------------------------------------------------------------


兩種實現方式:


1  懶漢模式(類加載時不初始化)


複製代碼
package Singleton;

public class LazySingleton {
//懶漢式單例模式
//比較懶,在類加載時,不創建實例,因此類加載速度快,但運行時獲取對象的速度慢


private static LazySingleton intance = null;//靜態私用成員,沒有初始化

private LazySingleton()
{
//私有構造函數
}

public static synchronized LazySingleton getInstance() //靜態,同步,公開訪問點
{
if(intance == null)
{
intance
= new LazySingleton();
}
return intance;
}
}
複製代碼


關鍵點:(代碼註釋上已給出)

1)構造函數定義爲私有----不能在別的類中來獲取該類的對象,只能在類自身中得到自己的對象

2)成員變量爲static的,沒有初始化----類加載快,但訪問類的唯一實例慢,static保證在自身類中獲取自身對象

3)公開訪問點getInstance: public和synchronized的-----public保證對外公開,同步保證多線程時的正確性(因爲類變量不是在加載時初始化的)

優缺點見代碼註釋。




2  餓漢式單例模式(在類加載時就完成了初始化,所以類加載較慢,但獲取對象的速度快)


複製代碼
package Singleton;

public class EagerSingleton {
//餓漢單例模式
//在類加載時就完成了初始化,所以類加載較慢,但獲取對象的速度快

private static EagerSingleton instance = new EagerSingleton();//靜態私有成員,已初始化

private EagerSingleton()
{
//私有構造函數
}

public static EagerSingleton getInstance() //靜態,不用同步(類加載時已初始化,不會有多線程的問題)
{
return instance;
}


}
複製代碼


關鍵點:(代碼註釋已寫)

1)私有構造函數

2)靜態私有成員--在類加載時已初始化

3)公開訪問點getInstance-----不需要同步,因爲在類加載時已經初始化完畢,也不需要判斷null,直接返回

優缺點見代碼註釋。



--------------------------------------------------------------------------------------------------------------------------------------------------


關於單例模式跟全局變量有什麼區別,似乎也可以提供一個public的類變量和一個private的構造函數實現類似的功能。

查了下資料,還沒搞的十分明白,望各位達人解答。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章