定義
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例 。
單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成為系統中的唯一實例。要實現這一點,可以從客戶端對其進行實例化開始。因此需 要用一種只允許生成對象類的唯一實例的機制,“阻止”所有想要生成對象的訪問。使用工廠方法來限制實例化過程。這個方法應該是靜態方法(類方法),因為讓 類的實例去生成另一個唯一實例毫無意義。
其又分為三種形式
餓漢式
//只有內部類可以為static。 public class SingIn{ //在自己內部定義自己的一個實例,只供內部調用 private static final SingIn instance = new SingIn(); private SingIn(){ } //這里提供了一個供外部訪問本class的靜態方法,可以直接訪問 public static SingIn getInstance(){ return instance; } }
懶漢式
/*** * 一種常用的形式 */ private static SingIn instance = null; public static synchronized SingIn getInstance() { // 這個方法比上面有所改進,不用每次都進行生成對象,只是第一次 // 使用時生成實例,提高了效率! if (instance == null) instance = new SingIn(); return instance; }
雙重鎖式
//將同步內容下方到if內部,提高了執行的效率,不必每次獲取對象時都進行同步,只有第一次才同步,創建了以后就沒必要了。 private static volatile SingIn instance=null; private SingIn (){ } public static SingIn getInstance(){ if(instance==null){ synchronized(SingIn .class){ if(instance==null){ instance=new SingIn (); } } } return instance; }
使用方式,直接調用getInstance()方法即可得到對象。
優點
實例控制:Singln 會阻止其他對象實例化其自己的 Singln 對象的副本,從而確保所有對象都訪問唯一實例
靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程
缺點
開銷:雖然數量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷,可以通過使用靜態初始化解決此問題。
可能的開發混淆:使用 Singln 對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用 new 關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發人員可能會意外發現自己無法直接實例化此類。
對象的生存期:Singln 不能解決刪除單個對象的問題。