單例模式實際應用


項目中需要在程序啟動時,將數據加載到內存中,所以要使用靜態或者單例模式。
如何選擇?
 為什么使用單例模式而不用靜態方法?

從面相對象的角度講:
  雖然都能實現目的,但是他們一個是基於對象,一個是面向對象的,就像我們不面相對象也能解決問題一樣,面相對象的代碼提供一個更好的編程思想。
如果一個方法和他所在類的實例對象無關,那么它就應該是靜態的,反之他就應該是非靜態的。如果我們確實應該使用非靜態的方法,但是在創建類時又確實只需要維護一份實例時,就需要用單例模式了。
比如說我們在系統運行時候,就需要加載一些配置和屬性,這些配置和屬性是一定存在了,又是公共的,同時需要在整個生命周期中都存在,所以只需要一份就行,這個時候如果需要我再需要的時候new一個,再給他分配值,顯然是浪費內存並且再賦值沒什么意義,所以這個時候我們就需要單例模式或靜態方法去維持一份且僅這一份拷貝,但此時這些配置和屬性又是通過面向對象的編碼方式得到的,我們就應該使用單例模式,或者不是面向對象的,但他本身的屬性應該是面對對象的,我們使用靜態方法雖然能同樣解決問題,但是最好的解決方案也應該是使用單例模式。
從功能上講:
  單例模式可以控制單例數量;可以進行有意義的派生;對實例的創建有更自由的控制;[轉自http://www.cnblogs.com/seesea125/archive/2012/04/05/2433463.html為什么要使用單例模式]

總體來說就是,單例模式和靜態方法都可以解決這個問題,處於面向對象考慮,優先選擇單例模式。

1、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);
        }
    }
    
}
2、單例模式
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 哈哈
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM