總結
單例可以說是gof23中最簡單的一種設計模式,也經常用到。比如window的任務管理器,比如servlet物件等等。
單例要完成的就是確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個唯一的例項。就像它的定義:
ensure a class has only one instance, and provide a global point of access to it.
最近學習整理了一下常見的單例模式實現方法(因為我見過的也不多,所以暫且認為我見過的就是常見的吧哈),大概有這麼6種。
實現單例就是要讓物件在整個系統中是唯一的,不能被隨意的例項化。還要考慮像執行緒安全問題,延遲載入問題等,就要看其具體的使用環境了。
懶漢式、餓漢式、雙重檢查鎖、靜態內部類、列舉、單例工廠和防範措施,**放在我的github的設計模式倉庫中。
話不多說,上栗子。
/**
* 懶漢式
* @author liu
* 類初始化時不初始化這個物件,延時載入,真要用時再載入
*/
public
class
singletondeom1
//方法有同步,效率略低
public
synchronized singletondeom1 getinstance()
return instance;
}}
/**
* 餓漢式
* @author liu
* 類載入時立即初始化這個物件,類載入執行緒安全,沒有延時載入
*/
public
class
singletondemo2
//沒有同步,效率略高
public singletondemo2 getinstance()
}
/**
* 雙重檢查鎖
* @author liu
* 同步快在if內部,第一次同步,之後不用同步。
* jvm底層實現的問題,有時執行順序會出問題。
* 比懶漢式略提高。
*/
public
class
singletondemo3 }}
instance = demo;}}
return instance;
}private
singletondemo3()
}
/**
* jvm保障列舉單例和執行緒安全,但無延時載入。
* @author liu
* */
public enum singletondemo5
}
是jvm直接罩著的,用起來比較方便。
/**
* 靜態內部類形式
* @author liu
* 不會立即載入,呼叫get才會載入內部類,載入類是執行緒安全的,延時載入又執行緒安全。
*/public class singletondemo4
private static class instance
public singletondemo4 getsingletondemo4()
}
加強版懶漢式,是比較好用的一種。
/**
* 單例類
* @author liu
* 要建立這個單例類的單例物件
*/public class singletondemo7_1
public void dosomething()
}/**
* 用工廠方法實現單例
* @author liu
* 當然要通過正常的渠道,其他類通過反射也是可以獲得單例類的其他物件的。
*/public class singletondemo7_2 catch(exception e)
}public singletondemo7_1 getsingletondemo7_1()
}
借助了工廠模式,單例工廠只產生同乙個單例物件。
如果是架構級的,還要考慮防範通過非正常渠道,比如反射、反序列化方法獲取物件,以懶漢式為例。
/**
* 防止反射和反序列化破壞
* @author liu
* */
public class singletondemo6
}//反序列化時,有readresolve方法,則直接返回此方法指定的物件,而不建立新的物件。
private object readresolve()
public synchronized singletondemo6 getsingletondemo6()
return instance;
}}
當全域性只需要乙個且只能有乙個物件的時候就用單例嘍。簡單說就是通過構造方法的私有化,不讓別人隨意建立新的物件,而是用自己建立好的唯一的物件提供給物件的呼叫者。
至於對是否延遲載入、執行緒安全和特殊情況的防範,就要看使用的具體環境了。當然,如果需要的話也可以從單例模式擴充套件為多例。
最後thanks for 《設計模式之禪》(秦小波 著)
單例設計模式的幾種實現方法
author lais public class ehansingle 私有化靜態物件,並直接建立,強調單例時可以用final修飾 private final static ehansingle single new ehansingle 提供外界獲取方式 public static ehansin...
幾種常見的單例模式
單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些...
設計模式 單例模式的幾種實現方式
1.概述 單例模式 簡單的說就是可以確保只產生乙個類例項,讓多個使用者或者多個執行緒同時使用這乙個例項,而不需要每次使用都建立一次物件。2.優缺點和適用場景 3.幾種不同形式的單例模式 class singleclass public static singleclass getinstance 這...