zoukankan      html  css  js  c++  java
  • 单例模式实际应用

    项目中需要在程序启动时,将数据加载到内存中,所以要使用静态或者单例模式。
    如何选择?
     为什么使用单例模式而不用静态方法?

    从面相对象的角度讲:
      虽然都能实现目的,但是他们一个是基于对象,一个是面向对象的,就像我们不面相对象也能解决问题一样,面相对象的代码提供一个更好的编程思想。
    如果一个方法和他所在类的实例对象无关,那么它就应该是静态的,反之他就应该是非静态的。如果我们确实应该使用非静态的方法,但是在创建类时又确实只需要维护一份实例时,就需要用单例模式了。
    比如说我们在系统运行时候,就需要加载一些配置和属性,这些配置和属性是一定存在了,又是公共的,同时需要在整个生命周期中都存在,所以只需要一份就行,这个时候如果需要我再需要的时候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 哈哈
     
  • 相关阅读:
    目录 —— C语言数据结构与算法分析
    目录 —— STM32裸机
    目录 —— FreeRTOS
    常用存储器介绍
    DMA(Data Memory Access)直接存储器访问
    命令
    文件数据流向
    野指针产生的原因
    内存四区
    SVG 是什么?
  • 原文地址:https://www.cnblogs.com/volare/p/3945374.html
Copyright © 2011-2022 走看看