項目中須要在程序啓動時,將數據加載到內存中,因此要使用靜態或者單例模式。
如何選擇?
爲何使用單例模式而不用靜態方法?
從面相對象的角度講:
雖然都能實現目的,可是他們一個是基於對象,一個是面向對象的,就像咱們不面相對象也能解決問題同樣,面相對象的代碼提供一個更好的編程思想。
若是一個方法和他所在類的實例對象無關,那麼它就應該是靜態的,反之他就應該是非靜態的。若是咱們確實應該使用非靜態的方法,可是在建立類時又確實只須要維護一份實例時,就須要用單例模式了。
好比說咱們在系統運行時候,就須要加載一些配置和屬性,這些配置和屬性是必定存在了,又是公共的,同時須要在整個生命週期中都存在,因此只須要一份就行,這個時候若是須要我再須要的時候new一個,再給他分配值,顯然是浪費內存而且再賦值沒什麼意義,因此這個時候咱們就須要單例模式或靜態方法去維持一份且僅這一份拷貝,但此時這些配置和屬性又是經過面向對象的編碼方式獲得的,咱們就應該使用單例模式,或者不是面向對象的,但他自己的屬性應該是面對對象的,咱們使用靜態方法雖然能一樣解決問題,可是最好的解決方案也應該是使用單例模式。
從功能上講:
單例模式能夠控制單例數量;能夠進行有意義的派生;對實例的建立有更自由的控制;[轉自http://www.cnblogs.com/seesea125/archive/2012/04/05/2433463.html爲何要使用單例模式]
整體來講就是,單例模式和靜態方法均可以解決這個問題,處於面向對象考慮,優先選擇單例模式。
一、spring啓動時加載
public class UserConfigListener extends ContextLoaderListener { protected final Log logger = LogFactory.getLog(getClass()); public void contextInitialized(ServletContextEvent event) { try { Config.getInstance().init(); } catch (Exception e) { logger.error("初始化信息錯誤:", e); } } }
二、單例模式
public class Config { private static Config instance = new rConfig(); private Map<String, String> info = new HashMap<String, String>(); // 得到惟一實例 public static Config getInstance() { return instance; } // 控制惟一實例 private Config() { } public void init() throws Exception { info.put("aa","bb"); } public Map<String, String> getUInfo() { return info; } }
之前只是字面上知道單例模式,並無實際用過,只是知道得到惟一實例,可是不清楚如何在這個實例中進行其餘的操做。如今終於明白了,o(∩_∩)o 哈哈