java设计模式 第二讲 单例模式

  • 单例模式:Ensure a class has only one instance,and provide a global point of access to it 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例;     其作用是确保一个类只有一个实例存在
  • 分类
    • 饿汉式单例类:类加载时,就进行对象实例化
    • publiic class Singleton{  
           private static Singleton m_instance = new Singleton();  
      //构造方法私有,保证外界无法直接实例化  
          private Singleton(){  
          }  
      //通过该方法获得实例对象  
         public static Singleton getInstance(){  
           return m_instance;  
        }  
        //说明:从上述代码中可以看到,在类被加载时,静态变量m_instance会被初始化,此时类的私有构造函数会被调用,单例类的唯一实例就被创建出来了。单例类中一个最重要的特点是类的构造函数是私有的,从而避免外界利用构造函数直接创建出任意多的实例;而且由于构造函数私有,该类不能被继承


    • 
      
      
      
      
      
    • 懒汉式单例类:第一次引用类时,才进行对象的实例化   
      publiic class Singleton{
           private static Singleton _instance = null;
      //构造方法私有,保证外界无法直接实例化
          private Singleton(){
          }
      //方法同步
         synchronized public static Singleton getInstance(){
           if(_instance == null){
                 _instance = new Singleton();
              }
           return _instance;
        }
      }
      
      说明:上述代码中,对静态方法getInstance()进行同步,以确保多线程环境下只创建一个实例,例如,若getInstance()方法未被同步,并且线程A和线程B同时调用此方法,则执行if(_instance == null)时都为真,那么这两个线程都会创建一个对象,但使用了synchronized关键字就可解决这个问题。
  • 单例模式的优点:
    • 内存中只有一个实例,减少了开支;
    • 只生成一个实例,同样减少了性能开销;
    • 避免对资源的多重占用(有点像操作系统中的原子操作)
    • 可在系统设置全局访问点,优化和共享资源访问;
  • 缺点:
    • 无法创建子类,扩展困难,必须修改代码;
    • 对测试不利;
  • 使用场景:
    • 要求生成唯一序列号的环境;
    • 整个项目中需要一个共享访问点或共享数据;
    • 创建一个对象需要消耗的资源较多时,如访问IO和数据库的资源;
    • 需定义大量的静态常量和静态方法的环境;
    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章