GOF業務場景的設計模式 單例模式

2022-07-20 16:57:11 字數 1854 閱讀 2492

個人覺得 純粹的學習設計模式,是不對的。也不能為了使用設計模式,而硬搬設計模式來使用

單例模式可能是 最簡單的設計模式也是 大家知道最多的設計模式。當然 ,有很多種寫法

定義:確保乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。

業務場景

很多時候,我們的系統需要 很多的一些常量資料,這些資料在不同的環境下可能會不同。但是一旦確定了執行環境,這些配置常量,就不會改變。

我們在**中需要用到這些常量,如果每一次使用,都從配置檔案中讀取,這樣會損耗大量的io。所以將這些配置檔案以單例的形式儲存在記憶體中是一種完美的解決方案。

餓漢式單例

public class singleton 

public static singleton getinstance()

}

懶漢式單例

public class singleton 

public static synchronized singleton getinstance()

return singleton;

}}

本人最喜歡的一種模式,完美實現的實現既執行緒安全又延遲載入的模式(initialization on demand holder)使用靜態內部類lz認為這是大師級別的單例模式,只有對於類載入,初始化有清晰的了解才能寫出這樣的**

public class configsingleton 

public string getdomain()

public string getversion()

//私有化構造方法(禁止私自產生物件)

private configsingleton () catch (ioexception e)

this.environment = pps.getproperty("environment");

this.domain = pps.getproperty("domain");

this.version = pps.getproperty("version");

}

//靜態內部類

private static class lazyholder

//暴露出來的獲取單例物件的靜態方法

public static final configsingleton getinstance()

}

測試類**

public class singletontest 

}

測試結果

擴充套件思維

在乙個jvm中會出現多個單例嗎

在分布式系統、多個類載入器、以及序列化的的情況下,會產生多個單例,這一點是無庸置疑的。那麼在同乙個jvm中,會不會產生單例呢?使用單例提供的getinstance()方法只能得到同乙個單例,除非是使用反射方式,將會得到新的單例。**如下

public class singletontest 

}

執行結果

這樣,每次執行都會產生新的單例物件。所以運用單例模式時,一定注意不要使用反射產生新的單例物件。

單例模式注意事項:

參考:

GOF23設計模式(單例模式)

保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。單例模式的優點 1.由於單例模式只生成乙個例項,減少了系統效能開銷,當乙個物件的產生需要比較多的資源時,如讀取配置 產生其他依賴物件時,則可以通過在應用啟動時直接產生乙個單例物件,然後永久駐留記憶體的方式來解決 2.單例模式可以在系統設定...

Headfirst java設計模式 單例模式

單例 件 模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。實現 1.懶漢式 通過延遲例項化實現的單例模式 使用synchronized處理多執行緒訪問,但是效能較差。public class lazyinstantiazesingleton public static synchronized...

GOF之單例模式

何為單例模式?通常點說就是乙個類只有乙個例項,這意味著其建構函式是私有的。這裡讓我想到了spring ioc管理的bean,預設也是單例的。不過這裡的概念跟設計模式裡的單例不一樣,ioc裡的bean被設計成單例 在於為了servlet容器初始化spring容器時降低記憶體開銷。spring ioc還...