1.保證一個類只有一個實例的機制.
2.站在類的設計者的角度,強制使一個類只能有一個實例,而不是站在類的使用者角度。
一:簡單實現
//簡單模式
class singletonOne


{
//靜態變量
private static singletonOne stOne = null;
//私有構造器

private singletonOne()
{}
//獲取實例方法
public static singletonOne getInstance()

{
if(stOne == null)

{
stOne = new singletonOne();
}
return stOne;
}
}
優點是簡單,清淅明了。缺點是在多線程環境下不能保證只實例化一次。如A,B兩線程,同時判斷stOne == null 為真,就會實例化兩次。
二:線程安全
1
class singletonTwo
2

{
3
//靜態變量
4
private static singletonTwo stTwo = null;
5
//私有構造器
6
private singletonTwo()
{}
7
//線程對象
8
private static Object obj = new Object();
9
10
//獲取實例方法1 完全保證線程安全,但增大了不必要的線程開銷
11
public synchronized static singletonTwo getInstance()
12
{
13
if(stTwo == null)
14
{
15
stTwo = new singletonTwo();
16
}
17
return stTwo;
18
}
19
20
//獲取實例方法2 當其它類或線程第二次來調用時,減少相應線程開銷
21
public static singletonTwo getInstanceTwo()
22
{
23
if(stTwo == null)
24
{
25
synchronized(obj)
26
{
27
if(stTwo == null)//此處判斷的作用在于:當第一次初始化時即有多個線程進入第一個 stTwo == null 的判斷塊,同時等待obj的線程釋放。
28
{
29
stTwo = new singletonTwo();
30
}
31
}
32
}
33
return stTwo;
34
}
35
}
優點為:因為實例化語句處于getInstance方法里,即當需要一個singleton實例時,才會產生。這種方法稱為惰性實例化,惰性實例化避免了在不必要一個實例時產生了實例對象。
三:靜態初始化
//直接實例化一個靜態實例
class staticSingletonOne


{
private static staticSingletonOne staticStOne = new staticSingletonOne();
public static int num = 0;
private staticSingletonOne()

{
num = 10;
}
public static staticSingletonOne getInstance()

{
return staticStOne;
}
public static void SystemOutNum()

{
System.out.println(num++);
}
public static void main(String[] str)

{
staticSingletonOne.SystemOutNum();
staticSingletonOne.SystemOutNum();
staticSingletonOne.SystemOutNum();
staticSingletonOne.SystemOutNum();
}
}

//通過靜態代碼塊實例化一個靜態實例
class staticSingletonTwo


{
private static staticSingletonTwo staticStTwo;
public static int num = 0;
private staticSingletonTwo()

{
num = 10;
}
static

{
staticStTwo = new staticSingletonTwo();
}
public static staticSingletonTwo getInstance()

{
return staticStTwo;
}
public static void SystemOutNum()

{
System.out.println(num++);
}
public static void main(String[] str)

{
staticSingletonTwo.SystemOutNum();
staticSingletonTwo.SystemOutNum();
staticSingletonTwo.SystemOutNum();
staticSingletonTwo.SystemOutNum();
}
}

//此兩個類對于 singleton這個模式而言,產生的對象是沒有任何區別的。
//同樣只執行了一次staticStTwo = new staticSingletonTwo(),但輸出的數字卻有戲劇性的區別,staticSingletonOne輸出的為0,1,2,3 而staticSingletonTwo輸出的卻為10,11,12,13。
//根本原因在于:staticSingletonOne在實例化對象時將 num賦為10,隨后在執行靜態變量初始化時又賦為了0。而在staticSingletonTwo, num 變量與實例化語句同處于靜態變量中,先num=0,然后才賦num=10操作。
要點:
1.singleton不要支持序列化,避免出現多個實例,與singleton模式理念沖突
2.singleton只考慮到了對象的創建管理,沒有考慮到對象的銷毀管理,在支持垃圾回收的平臺下(.net,java),一般不需要考慮對對象銷毀管理作特別的處理。
3.模式的核心為:控制類的使用者對類的實例方法任意使用并使最終只產生一個實例。
4.普通實現方法,每次都需要檢查類的對象是否已經存在,增大開銷,建議使用靜態初始化方法。