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