設計模式之單例模式

  單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個實例,即一個類只有一個對象實例。

  Java中單例模式定義:“一個類有且僅有一個實例,並且自行實例化向整個系統提供。”  

package 單例模式;
import java.util.HashMap;
import java.util.Map;
//1.懶漢式單例類,調用getInstance()則實例化,不調用不實例化
public class Singleton {
	/**
	 * Singleton通過將構造方法限定爲private避免了類在外部被實例化,
	 * 在同一個虛擬機範圍內,Singleton的唯一實例只能通過getInstance()方法訪問。
	 */
	private Singleton(){}
	private static Singleton single=null;
	//確保線程安全的寫法
	//(1)在getInstance方法上加同步
	public static synchronized Singleton getInstance(){
		if(single==null){
			single=new Singleton();
		}
		return single;		
	}
	//(2)雙重檢查鎖定
	public static Singleton getInstance2(){
		if(single==null){
			synchronized(Singleton.class){
				if(single==null){
					single=new Singleton();
				}
			}
		}
		return single;
	}	
}
	//(3)靜態內部類[既實現了線程安全,又避免了同步帶來的性能影響]
	class SingletonStatic{
		private static class LazyHolder{
			private static final SingletonStatic INSTANCE=new SingletonStatic();			
		}
		private SingletonStatic(){}
		public static final SingletonStatic getInstance(){
			return LazyHolder.INSTANCE;
		}
	}
	
	/**
	 * 2.餓漢式單例類,在類初始化時,已經自行實例化
	 * 餓漢式在類創建的同時就已經創建好一個靜態的對象供系統使用,
	 * 		以後不再改變,所以天生是線程安全的。
	 */
	class Singleton2{
		private Singleton2(){}
		private static final Singleton2 single=new Singleton2();
		//靜態工廠方法
		public static Singleton2 getInstance(){
			return single;
		}
	}
----------------------------------------------
package 單例模式;
/*
 * 測試類
 */
public class Test {
	public static void main(String[] args) {
//		Singleton3 single3=Singleton3.getInstance(null);
//		System.out.println(single3.about());
		Singleton s1=Singleton.getInstance();
		Singleton s2=Singleton.getInstance();
		System.out.println(s1);
		System.out.println(s2);
	}
}

  執行測試類,控制檯打印如下:

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