Java設計模式-單例模式(Singleton)

目的:

確保一個類只能實例化一個對象,並提供一個全局訪問點。

什麼時候用:

  • 一個類只實例化一個對象時。

典型使用:

  • 日誌類
  • 管理數據庫連接
  • IO,文件操作

實際的例子:

示例代碼:

  • 線程安全(在定義變量instance時初始化)
public class EagerlySingleton {     //單例類
	private static EagerlySingleton instance = new EagerlySingleton();

	private EagerlySingleton() {
	}

	public static EagerlySingleton getInstance() {
		return instance;
	}
}
public class App{              //測試
	public static void main(String[] args) {
		EagerlySingleton eSingleton1 = EagerlySingleton.getInstance();
		EagerlySingleton eSingleton2 = EagerlySingleton.getInstance();
		System.out.println("eSingleton1=" + eSingleton1);
		System.out.println("eSingleton2=" + eSingleton2);
}}
輸出:
eSingleton1=EagerlySingleton@487f6155
eSingleton2=EagerlySingleton@487f6155

  • 線程安全
public class LazySingleton {
	private static LazySingleton instance = null;
	
	private LazySingleton() {
	}

	public synchronized static LazySingleton getInstance() {      //synchronized
		if (instance == null) {
			instance = new LazySingleton();
		}
		return instance;
	}
}

  • Enum
public enum EnumSingleton {
    INSTANCE;

    @Override
    public String toString() {
        return getDeclaringClass().getCanonicalName() + "@" + hashCode();
    }
}
<pre name="code" class="java">public class App {
	public static void main(String[] args) {
		EnumSingleton enumSingleton1 = EnumSingleton.INSTANCE;
		EnumSingleton enumSingleton2 = EnumSingleton.INSTANCE;
		System.out.println("enumSingleton1=" + enumSingleton1); // enumSingleton1=EnumSingleton@298792720
		System.out.println("enumSingleton2=" + enumSingleton2); // enumSingleton2=EnumSingleton@298792720
<span style="white-space:pre">	</span>}
}

  • Serializable
import java.io.Serializable;
public class InitializingOnDemandHolderIdiom implements Serializable{
	private static final long serialVersionUID = 1L;

	private static class HelperHolder {
		public static final InitializingOnDemandHolderIdiom INSTANCE = new InitializingOnDemandHolderIdiom();
	}

	public static InitializingOnDemandHolderIdiom getInstance() {
		return HelperHolder.INSTANCE;
	}

	private InitializingOnDemandHolderIdiom() {
	}

	protected Object readResolve() {
		return getInstance();
	}
}
public class App {

	public static void main(String[] args) {


		InitializingOnDemandHolderIdiom demandHolderIdiom = InitializingOnDemandHolderIdiom.getInstance();
		System.out.println(demandHolderIdiom);<span style="white-space:pre">	</span>  //InitializingOnDemandHolderIdiom@528f2588
		InitializingOnDemandHolderIdiom demandHolderIdiom2 = InitializingOnDemandHolderIdiom.getInstance();
		System.out.println(demandHolderIdiom2);  //InitializingOnDemandHolderIdiom@528f2588
<span style="white-space:pre">	</span>}
}

  • Double check locking
public class DoubleCheckLocking {
	private static volatile DoubleCheckLocking INSTANCE;

	private DoubleCheckLocking() {
		//反射
		if(INSTANCE != null)
			throw new IllegalStateException("initialized.");
	}
	
	public static DoubleCheckLocking getInstance() { 
		DoubleCheckLocking result = INSTANCE;
		if (result == null) {
			synchronized (DoubleCheckLocking.class) {
				result = INSTANCE;
				if (result == null) {
					INSTANCE = result = new DoubleCheckLocking();
				}
			}
		}
		return result;
	}
}
public class App {

	public static void main(String[] args) {
		DoubleCheckLocking dcl1 = DoubleCheckLocking.getInstance();
		System.out.println(dcl1);   //DoubleCheckLocking@487f6155
		DoubleCheckLocking dcl2 = DoubleCheckLocking.getInstance();
		System.out.println(dcl2);   //DoubleCheckLocking@487f6155
	}
}

@斗大的熊貓









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