單例模式是設計模式中使用最普遍的模式之一秧荆,它是一種對象創(chuàng)建模式,用于創(chuàng)建一個對象的具體示事例埃仪,它可以確保系統(tǒng)中一個類只產(chǎn)生一個實例乙濒。
使用單例設計模式給我?guī)淼暮锰幘褪牵?/p>
1,對于頻繁使用的對象卵蛉,可以省略創(chuàng)建對象所花費的時間
2颁股,由于new的次數(shù)減少,因而對內存的使用頻率也會降低傻丝,這將減輕GC壓力豌蟋,因此,使用單例模式便可以有效的改善系統(tǒng)性能
單例模式的核心在于通過一個接口返回唯一的對象事例桑滩,下面的示例即為一個簡單的單例模式設計:
public class Singleton{
?????? private Singleton(){}
?????? private static Singleton singleton = new Singleton();
?????? public static Singleton getInstance(){
??????????? return singleton;
??????? }
}
注意:單例類必須要有一個私有的構造方法,用來防止類被系統(tǒng)中的其它代碼實例化允睹,其次运准,成員變量和方法是static的。
上面這種單例的設計模式俗稱惡漢式缭受,非常簡單可靠胁澳,但不足之處就是無法對singleton實例做延遲加載。加入單例的創(chuàng)建過程很慢米者,而成員變量又是靜態(tài)的韭畸,因此jvm加載單例類時,單例對象就會被創(chuàng)建蔓搞,而此時胰丁,如果這個單例類在系統(tǒng)的其它地方使用在,那么使用這個單例類的地方都會初始化這個成員變量喂分,而不管是否被使用到锦庸,相當于我們并沒有使用單例類,但是它還是會被創(chuàng)建出來蒲祈。
為了解決這個問題甘萧,并提高系統(tǒng)在相關函數(shù)調用時的反應速度,就需引入延遲加載機制梆掸。
public class Singleton {
??????? private Singleton() {}
??????? private static Singleton singleton = null;
??????? public synchronized static Singleton getInstance() {
?????????????? if (singleton == null) {
????????????????????? singleton = new Singleton();
??????????????? }return singleton;
????????? }
}
上面的示例中:對靜態(tài)成員變量賦值null保證啟動時沒有額外的負載扬卷,其次在靜態(tài)方法中判斷是否又singleton的實例,沒有則創(chuàng)建酸钦,有則直接返回怪得,注意的一點是,這個方法須是同步的,否則在多線程中會導致多個實例被創(chuàng)建汇恤。
上面的這種設計方式相對于第一種方式來說庞钢,雖然實現(xiàn)了延遲加載的功能,然而它引入了同步鎖因谎,因此在多線程環(huán)境中基括,它的耗時要比第一種大很多,因此為了解決這個問題财岔,還需要對其進行改進风皿。
public class Singleton {
???????? private Singleton() {}
???????? private static class SingletonHandler{
??????? ? ? ? ?? private static Singleton singleton = new Singleton();
????????? }
??????? public synchronized static Singleton getInstance() {
??????????????? return SingletonHandler.singleton;
???????? }
}
這個設計方法中:單例模式內部使用內部類來實例化一個單例的實例,這樣當Singleton類被加載時匠璧,其內部類并不會被實例化桐款,故當類被加載進jvm中的時候,單例對象并不會被實例化夷恍,而當getInstance方法被調用時才會加載內部類并實例化singleton魔眨。
因此這種方法同時兼?zhèn)渖厦鎯煞N實現(xiàn)的優(yōu)點。使用內部類的方法來實現(xiàn)單例酿雪,既可以做到延遲加載遏暴,也不必使用同步關鍵字,是一種比較完善的實現(xiàn)指黎。