1. 程式人生 > >【設計模式】單例模式的理解與場景舉例

【設計模式】單例模式的理解與場景舉例

數據 好處 ask 配置管理 關鍵詞 簡潔 多次 nag 序列

軟件設計常用的一種設計模式 —— 單例模式

體現:在應用這個模式時,單例對象的類必須保證只有一個實例存在。

好處:許多時候整個系統只需要擁有一個全局的對象,這樣有利於我們協調整個系統的行為。

場景舉例

1.服務器的配置信息放在一個文件中,這些配置數據由一個單例對象統一讀取,然後服務進程中的其他對象再通過這個單例對象讀取配置信息,這樣也簡化了復雜環境下的配置管理。

2.windows的task manager(任務管理器)就是單例的,我們並不能同時打開兩個。

3.多線程的線程池一般也是單例模式的,因為線程池要方便對線程進行控制管理。

實現方式

實現單例模式的對象類中構造函數是私有的,這樣其他代碼就不能通過調用該構造函數實例化對象,只能通過該類的靜態方法(通常使用getInstance這個名詞)來得到該類的唯一實例。

類別:

不加鎖(synchronized)的懶漢單例模式,不支持多線程,實際上也稱不上單例模式。

public class Singleton{

private Singleton(){

}

private static Singleton singleton;

public static Singleton getInstance(){

if(singleton==null){

singleton = new Singleton();

}

return singleton;

}

}

進化一點點的話,加上synchronized關鍵詞。

public class Singleton{

private static Singleton singleton;

private Singleton(){}

public static synchronized getInstance(){
if(singletion == null){
singletion = new Singletion();
}
return singletion;
}
}

或者,但是這樣容易產生垃圾。餓漢式倒是加載很快,只是會占據一定內存。

public class Singletion{

private static Singletion singleton = new Singletion();

private Singletion(){}

public static Singletion getInstance(){

return singleton;

}

}

最好的一種方式,枚舉。簡潔、且自動支持序列化機制,絕對防止多次實例化。

public enum Singleton{

INSTANCE;

public void method(){}

}

【設計模式】單例模式的理解與場景舉例