1. 程式人生 > >Effective Java 學習 第三條 用私有構造器或者列舉型別強化Singleton屬性

Effective Java 學習 第三條 用私有構造器或者列舉型別強化Singleton屬性

綜述:Singleton即單例模式是指僅僅被例項化一次的類。比如工作管理員、檔案管理器、回收站、某些工具類等,這些類在程式中僅僅需要一個例項就足夠了,這個時候可以考慮使用單例模式。,以下介紹三種實現單例模式的方法:

1.餓漢式(類載入時建立例項)

/**
 * Created by luffy on 9/21/15.
 * 方法一實現單例模式:使用靜態常量來作為唯一的例項,保證該類只有一個例項
 */
public class Elvis01 {
    public static final Elvis01 ELVIS_01 = new Elvis01();
    private Elvis01(){

    }
    public void leaveTheBuilding(){
        System.out.println("Elvis01 leaveTheBuilding");
    }
}
特點:執行緒安全,不能防止反射攻擊,序列化需要進行額外工作(實現Serializable)
2.餓漢變種(提供靜態方法獲取例項)
/**
 * Created by luffy on 9/21/15.
 * 方法二實現單例模式:通過提供靜態方法獲取該類的例項
 */
public class Elvis02 implements Serializable{
    private static final Elvis02 elvis = new Elvis02();
    private Elvis02(){

    }
    public void leaveTheBuilding(){
        System.out.println("Elvis02 leaveTheBuilding");
    }
    public static Elvis02 getInstance(){
        return elvis;
    }
}
特點:執行緒安全,不能防止反射攻擊,序列化需要進行額外工作(實現Serializable)

3.懶漢式

/**
 * Created by luffy on 9/21/15.
 * 方法三實現單例模式:懶漢式
 */
public class Elvis04 implements Serializable{
    private Elvis04 instance;

    private Elvis04(){

    }
    public Elvis04 getInstance(){
        if(instance == null){
            instance = new Elvis04();
        }
        return instance;
    }
}
特點:懶漢式,執行緒不安全,序列化需要進行額外工作(實現Serializable),延時載入

4.列舉型別的單例模式

/**
 * Created by luffy on 9/21/15.
 * 方法四實現單例模式:使用列舉型別,保證執行緒安全
 */
public enum  Elvis03 implements Serializable{
    INSTANCE;
    public void leaveTheBuilding(){
        System.out.println("Elvis03 leaveTheBuilding");
    }
}
特點:絕對防止多次例項化,即使是面對複雜的序列化活著反射攻擊的時候。雖然這種方法還沒有被廣泛採用,但是單元素的列舉型別已經成為實現Singleton的最佳方法。

5.靜態內部類

/**
 * Created by luffy on 9/21/15.
 * 方法五實現單例模式:靜態內部類
 */
public class Elvis05 implements Serializable{
    private Elvis05(){

    }
    public Elvis05 getInstance(){
        return SignletonHolder.instance;
    }
    private static class SignletonHolder{
        private static Elvis05 instance;
    }
    public void leaveTheBuilding(){
        System.out.println("Elvis03 leaveTheBuilding");
    }
}

特點:懶載入,執行緒安全