通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止你實例化多個對象。一個最好的方法就是,讓類自身負(fù)責(zé)保存它的唯一實例。這個類可以保證沒有其他實例可以被創(chuàng)建,并且它可以提供一個訪問該實例的方法。 [DP]
1. 概念
一個實現(xiàn)Singleton類一般擁有以下兩個方法,構(gòu)造函數(shù)Singleton(),以及獲取實例的方法GetInstance()。如下圖所示:

單例結(jié)構(gòu)圖.png
需要注意的是,構(gòu)造方法
Singleton()要私有化(用private修飾),獲取實例的方法GetInstance()要設(shè)置為靜態(tài)(static)。
2. 實現(xiàn)方法
- 懶漢式
//懶漢式單例類.在第一次調(diào)用的時候?qū)嵗约?
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//靜態(tài)工廠方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
- 惡漢式
//餓漢式單例類.在類初始化時,已經(jīng)自行實例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//靜態(tài)工廠方法
public static Singleton1 getInstance() {
return single;
}
}
3. 多線程時的單例模式
在多線程時,一般采用雙重鎖定的方式來實現(xiàn)單例模式
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}