單例模式 一.什麼是單例模式? 單例模式是java中最簡單的設計模式之一,屬於創建型設計模式,這種模式涉及到一個的單一的類,該類負責創建自己的對象,這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。(1.單例類只能有一個實例,2.單例類必須自己創建自己唯一實例,2.單例類 ...
單例模式
一.什麼是單例模式?
單例模式是java中最簡單的設計模式之一,屬於創建型設計模式,這種模式涉及到一個的單一的類,該類負責創建自己的對象,這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。(1.單例類只能有一個實例,2.單例類必須自己創建自己唯一實例,2.單例類必須給其它對象提供這個實例)。
二.單例模式的應用場景有什麼?
某些對象我們只需要一個實例的,比如:配置文件,工具類,線程池,緩存,日誌對象等這些,如果創建的實例過多,就會導致一些問題,比如占用資源,結果不一致的現象等。
三.餓漢模式實例
/** * 單例模式Singleton * 應用場合:有些對象只需要一個就足夠了,比如古代的皇帝 * 類型:餓漢模式 */ public class Singleton { //1.將構造方法私有化,不允許外部直接創建對象 private Singleton(){} //2.創建類的唯一實例,使用private static修飾 private static Singleton instance =new Singleton(); //3.提供一個用於獲取實例的方法,使用public static修飾 public static Singleton getInstance(){ return instance; } }
四.懶漢模式實例
/** * 懶漢模式(線程不安全,安全的話加synchronized) */ public class Singleton { //1.將構造方法私有化,不允許外部直接創建對象 private Singleton(){} //2.聲明類的唯一實例,使用private static修飾 private static Singleton instance =new Singleton(); //3.提供一個用於獲取實例的方法,使用public static修飾 public static Singleton getInstance(){ if(instance==null){ return new Singleton() ; } return instance; } }
五.懶漢模式和餓漢模式有什麼不同呢?
餓漢模式的特點是載入類的速度比較慢,但運行是獲取對象的速度比較快,而且是線程安全的,懶漢模式的特點是載入類的速度比較快,但運行時獲取對象的速度比較慢,而且不是線程安全的.
六.雙重檢查鎖實例
/** * 這種方式採用雙鎖機制,安全且在多線程情況下能保持高性能。 */ public class Singleton { private volatile static Singleton instance =new Singleton(); private Singleton(){} public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance==null){ return new Singleton(); } } } return instance; } }
七.登記證/靜態內部類
/** * 這種方式能達到雙檢鎖方式一樣的功效,但實現更簡單,當 Singleton類被裝載了,instance 不一定被初始化。 * 因為 SingletonHolder 類沒有被主動使用,只有通過顯式調用 getInstance 方法時, * 才會顯式裝載 SingletonHolder類從而實例化 instance,比餓漢式合理。 */ public class Singleton { private static class SingletonHolder{ private static Singleton instance =new Singleton(); } private Singleton(){} public static Singleton getInstance(){ return SingletonHolder.instance; } }
八.枚舉
/** *它不僅能避免多線程同步問題,而且還自動支持序列化機制,防止反序列化重新創建新的對象,絕對防止多次實例化 */ public enum Singleton { INSTANCE; private Object object=new Object(); private Singleton(){ object=new Object(); } public Object getObject(){ return object; } } class SingletonTest{ public static void main(String[] args){ Singleton.INSTANCE.getObject(); } }