1. 程式人生 > >java 設計模式之單例模式

java 設計模式之單例模式

單例模式:保證再程式執行過程中,該類只有一個例項物件

實現單例的方式有八種,我們只需要掌握其中幾個即可,下面我將用餓漢式,內部靜態類,列舉三種方式來講解單例

餓漢式和內部類

package com.iflytek.patten.singleton;

/**
 * 單例模式: 單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在
 * 場景: dateSource 一般都是單例  設計的目的是避免了每次的新建和銷燬的資源浪費
 * @author zhangh
 * @date 2018年11月16日上午9:38:06
 */
public class Singleton {

	/**
	 * 靜態常類 
	 */
	private static Singleton Instance = new Singleton();	
	/**
	 * 將該類的構造方法定義為私有方法,這樣其他處的程式碼就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項
	 */
	private Singleton(){}
	
	/**
	 * 在該類內提供一個靜態方法,當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用
	 * @author zhangh
	 * @date 2018年11月16日上午9:41:30
	 * @return
	 */
	public static Singleton getInstance(){
		return Instance;
	}
	/**
	 * 以上是餓漢式單例寫法:
	 * 優點:執行緒安全,類載入的時候就完成初始化
	 * 缺點:在類裝載的時候就完成例項化,沒有達到Lazy Loading的效果。如果從始至終從未使用過這個例項,則會造成記憶體的浪費
	 */
	
	/******************************************靜態內部類***********************************************************/
	//private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance1() {
        return SingletonInstance.INSTANCE;
    }
    /**
     * 類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,JVM幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的
     * 優點:避免了執行緒不安全,延遲載入,效率高。
     */
    /******************************************靜態內部類***********************************************************/
}

列舉類
package com.iflytek.patten.singleton;

/**
 * 通過列舉類來設計單例模式
 * @author zhangh
 * @date 2018年11月16日上午9:38:06
 */
public enum SingletonEnum {
    INSTANCE;
}

呼叫方式: SingletonEnum .INSTANCE