這個單例模式一般是只能創(chuàng)建一個實(shí)例的實(shí)現(xiàn),如網(wǎng)絡(luò)游戲里每個特定的地圖,對于任意一個玩家,這個地圖都是唯一的. 其特點(diǎn)是有一個私有的構(gòu)造器和一個公開的獲取實(shí)例的方法。比如:
//這是第一種,叫餓漢模式,無論是否需要,都弄一個出來
public class Singleton{
private static final Singleton st=new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
if(st==null)
{
return st;
}
}
}
//這是另外一種,叫懶漢模式,你不要我就不給弄,你要了再說.
public class SingleTon{
private static SingleTon st;
private SingleTon(){
}
public static SingleTon getInstance(){
if (st==null){
st=new SingleTon();
}
return st;
}
}
二者在大多數(shù)情況沒區(qū)別,但是餓漢模式是線程安全的,懶漢模式是要加同步鎖的.不同步的話,在這個類的實(shí)例還沒有創(chuàng)建的時候,多個線程同時去調(diào)用getInstance, 這時,由于沒有同步鎖,有可能會創(chuàng)建出多個實(shí)例來。
對于餓漢式,由于實(shí)例是在load class的時候創(chuàng)建的,所以就沒有這個問題。 當(dāng)然,除非2個線程采用了不同的class loader.
當(dāng)然, 無論餓漢還是懶漢, 幾率都不高, 但幾率低不代表不會出錯, 邏輯上也不對, 因此, 編程者還是應(yīng)該避免。
package test;
public class Singleton {
private Singleton s;
private Singleton()
{
}
public static Singleton getSigleton()
{
if(s==null)s=new Singleton();
return s;
}
}
這就是一個單例模式,我想應(yīng)該不用注釋了,原理就是這個類的構(gòu)造方法private了,所有在外邊不能調(diào)用,也就不能new Singleton();得到實(shí)例,那么
想得到實(shí)例就得調(diào)用它的靜態(tài)方法getSigleton();即Singleton.getSigleton();就會返回一個Singleton的實(shí)例,注意此方法中的語句,
即如果你是第一次調(diào)用這個方法那么它會給你new一個實(shí)例,以后再調(diào)用得到的都是這個實(shí)例,也就是說從始至終就只有一個Singleton的實(shí)例,這就是單例模式。
1、禁止掉可被調(diào)用的構(gòu)建方法
2、自動初始化一個實(shí)例
public class EagerSingleton{
private static final EagerSingletonst = new EagerSingleton();
private EagerSingleton(){}
public static EagerSingletongetInstance(){
return st;
}
}
public class LazySingleton{
private static LazySingletonst;
private LazySingleton(){}
synchronized public static LazySingleton getInstance(){
if (st==null){
st = new LazySingleton();
}
return st;
}
}
EagerSingleton比較適合JAVA