1. 程式人生 > >四種單例設計模式

四種單例設計模式

懶漢式

public class SingletonLazy {
private static SingletonLazy instance;
//初始化一個例項
private SingletonLazy() {};
//私有化該類的構造器
public static SingletonLazy getInstance() {//對外提供共有的訪問方式,訪問此例項物件
if (instance==null) {
instance = new SingletonLazy();
}
//如果沒有例項,就建立一個
return instance;
//返回例項物件
}
}

餓漢式

public class SingletonHungary {

private static  final SingletonHungary instance=new SingletonHungary(); 
//建立一個靜態的不可變的私有例項物件
private SingletonHungary() {}
//私有化該類的構造器
public static SingletonHungary getInstance() {
	
	return instance;
}

}

雙重鎖機制DCL

public class SingletonDoubleChecking {

private static SingletonDoubleChecking instance;//初始化一個例項

private SingletonDoubleChecking() {}//私有化構造器

public static SingletonDoubleChecking getInstance() {//對外提供共有的訪問該例項的方法
	if (instance==null) {//檢查是否為空,不為空時不檢查,節省效能消耗;為空時可能有併發問題
		synchronized (SingletonDoubleChecking.class) {
			if (instance==null) {
				instance =new SingletonDoubleChecking();
			}
		}
	}
	return instance;
}

}

列舉

/**

  • 列舉式單例,列舉的建立由JVM保證,因此不會出現併發問題,構造器自動私有,外部不能建立,只能引用
  • 用法為:SingletonEnum.INSTANCE.doSomething();
    */
    public enum SingletonEnum {
    //唯一例項,預設為public static final的
    INSTANCE;
    public String name;
    public void doSomething(){
    System.out.println(“doSomething”);
    }
    public static void main(String[] args) {
    SingletonEnum.INSTANCE.doSomething();
    }
    }

四種表現形式的區別

餓漢式跟懶漢式的話他們兩個都是執行緒不安全的,餓漢式是在類載入的時候就建立例項物件,而懶漢式是當需要用到該例項的時候他才去建立一個例項,開發當中一般用的餓漢式。
另外就要說到雙重鎖機制DCL了,它是執行緒安全的,當遇到併發的時候,它能很好的起作用,先判斷例項為不為NULL,不為空則不用管,直接返回該例項就行了,當它為NULL時,就用synchronized為它加鎖,再次判斷是否為空,為空就建立例項,不為空就返回例項。
列舉在例子中有介紹
他們四種方式共有的操作步驟就是:先私有化一個例項物件,再私有化該類的構造器,然後對外提供共有的訪問方式來訪問該例項物件,細微的差別就是建立例項的時間。