Java Singleton的3種實現方式

FrankYou發表於2017-07-28

1、通過靜態成員欄位來例項化

public class Elvis {
    /**
     * 通過final的靜態成員欄位來呼叫私有的建構函式例項化物件
     */
    public static final Elvis INSTANCE = new Elvis();

    /**
     * 私有建構函式,防止在類以外被例項化
     */
    private Elvis() {
    }

    public void leaveTheBuilding() {
        System.out.println("Leave the building...");
    }

    public static void main(String[] args) {
        Elvis.INSTANCE.leaveTheBuilding();
    }
}

2、通過公有的靜態工廠方法

public class Elvis {
    /**
     * 把靜態成員欄位設定為私有的
     */
    private static final Elvis INSTANCE = new Elvis();

    /**
     * 私有建構函式,防止在類以外被例項化
     */
    private Elvis() {
    }

    /**
     * 通過公有的靜態工廠方法匯出Single例項
     * @return Singleton例項
     */
    public Elvis getInstance(){
        return INSTANCE;
    }

    public void leaveTheBuilding() {
        System.out.println("Leave the building...");
    }

    public static void main(String[] args) {
        Elvis.INSTANCE.leaveTheBuilding();
    }
}

3、通過列舉來返回,這種方式更加簡潔,無償提供了序列化機制,絕對防止多次例項化,即使在面對多次序列化和範序列化攻擊的時候。雖然這種方法沒有被廣泛採用,但這種方式已經成為實現Singleton的最佳方法。

public class Elvis {
    /**
     * 把靜態成員欄位設定為私有的
     */
    private static final Elvis INSTANCE = new Elvis();

    /**
     * 私有建構函式,防止在類以外被例項化
     */
    private Elvis() {
    }

    /**
     * 通過包含單個元素的列舉型別來實現,推薦的方式(從Java 1.5 發行版起)
     */
    public enum Elvis1 {
        INSTANCE;

        public void leaveTheBuilding() {
            System.out.println("Leave the building...");
        }
    }

    public static void main(String[] args) {
        Elvis1.INSTANCE.leaveTheBuilding();
    }
}

 

 

相關文章