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(); } }