1 定义:确保某一个类只有一个实例,而且自行实例化,并且向整个系统提供这个实例,它提供全局的访问方法。 构造方法私有,获取实例的方法是oublic static,对象域是private static。
私有静态成员变量,存储唯一实例。
私有构造函数 。
公有静态成员方法,返回唯一实例 。
2 单例模式有三个要点:一是某个类只能有一个实例,二是必须自行创建这个实例 三是必须自行向整个系统提供这个实例。
3 饿汉式单例类:饿汉式单例类是实现起来最简单的单例类。由于在定义静态变量的时候实例化单例类,因此在类加载的时候就已经创建了单例对象。
4 懒汉式单例类:双重检查锁定(Double-Check Locking)懒汉式单例在第一次调用getInstance()方法时实例化,在类加载时并不自行实例化,这种技术又称为延迟加载(Lazy Load)技术,即需要的时候再加载实例。
5 饿汉式单例类在类被加载时就将自己实例化,它的优点在于无须考虑多线程访问问题,可以确保实例的唯一性;从调用速度和反应时间角度来讲,由于单例对象一开始就得以创建,因此要优于懒汉式单例。但是无论系统在运行时是否需要使用该单例对象,由于在类加载时该对象就需要创建,因此从资源利用效率角度来讲,饿汉式单例不及懒汉式单例,而且在系统加载时由于需要创建饿汉式单例对象,加载时间可能会比较长。
直接对方法加锁的缺陷:每次调用方法都需要加锁,即使时能直接返回实例时,这样效率低。
两层检查的作用:第一层延迟加载,第二层确保唯一的实例。
懒汉式单例类在第一次使用时创建,无须一直占用系统资源,实现了延迟加载,但是必须处理好多个线程同时访问的问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费大量时间,这意味着出现多线程同时首次引用此类的机率变得较大,需要通过双重检查锁定等机制进行控制,这将导致系统性能受到一定影响。
6 Initialization Demand Holder (IoDH)的技术:我们在单例类中增加一个静态(static)内部类,在该内部类中创建单例对象,再将该单例对象通过getInstance()方法返回给外部使用。通过使用IoDH,我们既可以实现延迟加载,又可以保证线程安全,不影响系统性能,不失为一种最好的Java语言单例模式实现方式。
延迟加载:内部类在第一次getInstance的时候才加载,去初始化其静态成员变量。
线程安全:因为JVM不会两次去加载一个类,所以new Instance()只会执行一次。
优点与缺点:
优点:内存中只存在一个实例,减少了内存开支,减少了系统的性能开销。
缺点:单例模式一般没有接口,扩展很困难,除非修改代码。
Android中应用:InputMethodManager