單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。這種模式涉及到一個單一的類,該類負責建立本身的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要實例化該類的對象。數據庫
單例模式5種建立方式:windows
實現代碼以下:設計模式
//餓漢式 public class SingletonDemo01 { // 類初始化時,會當即加載該對象,線程天生安全,調用效率高 private static SingletonDemo01 singletonDemo01 = new SingletonDemo01(); private SingletonDemo01() { System.out.println("SingletonDemo01初始化"); } public static SingletonDemo01 getInstance() { System.out.println("getInstance"); return singletonDemo01; } public static void main(String[] args) { SingletonDemo01 s1 = SingletonDemo01.getInstance(); SingletonDemo01 s2 = SingletonDemo01.getInstance(); System.out.println(s1 == s2);//結果爲ture } }
//懶漢式 public class SingletonDemo02 { //類初始化時,不會初始化該對象,真正須要使用的時候纔會建立該對。 private static SingletonDemo02 singletonDemo02; private SingletonDemo02() { } public synchronized static SingletonDemo02 getInstance() { if (singletonDemo02 == null) { singletonDemo02 = new SingletonDemo02(); } return singletonDemo02; } public static void main(String[] args) { SingletonDemo02 s1 = SingletonDemo02.getInstance(); SingletonDemo02 s2 = SingletonDemo02.getInstance(); System.out.println(s1 == s2);//結果爲true } }
//靜態內部類方式 public class SingletonDemo03 { private SingletonDemo03() { System.out.println("初始化.."); } public static class SingletonClassInstance { private static final SingletonDemo03 singletonDemo03 = new SingletonDemo03(); } // 方法沒有同步 public static SingletonDemo03 getInstance() { System.out.println("getInstance"); return SingletonClassInstance.singletonDemo03; } public static void main(String[] args) { SingletonDemo03 s1 = SingletonDemo03.getInstance(); SingletonDemo03 s2 = SingletonDemo03.getInstance(); System.out.println(s1 == s2);//結果爲true } }
//優點:兼顧了懶漢模式的內存優化(使用時才初始化)以及餓漢模式的安全性(不會被反射入侵)。
//劣勢:須要兩個類去作到這一點,雖然不會建立靜態內部類的對象,可是其 Class 對象仍是會被建立,並且是屬於永久帶的對象。
//枚舉單例式 public class User { public static User getInstance() { return SingletonDemo04.INSTANCE.getInstance(); } private static enum SingletonDemo04 { INSTANCE; // 枚舉元素爲單例 private User user; private SingletonDemo04() { System.out.println("SingletonDemo04"); user = new User(); } public User getInstance() { return user; } } public static void main(String[] args) { User u1 = User.getInstance(); User u2 = User.getInstance(); System.out.println(u1 == u2);//結果爲true } }
//雙重檢測方式 public class SingletonDemo04 { private SingletonDemo04 singletonDemo04; private SingletonDemo04() { } public SingletonDemo04 getInstance() { if (singletonDemo04 == null) { synchronized (this) { if (singletonDemo04 == null) { singletonDemo04 = new SingletonDemo04(); } } } return singletonDemo04; } }
優勢: 安全
缺點: 多線程
注意事項:工具
應用場景:
單例模式只容許建立一個對象,所以節省內存,加快對象訪問速度,所以對象須要被公用的場合適合使用。性能
舉例: 優化