单例模式:
(1) 目的:保证某个类中只有一个实例存在;(管理器和控制器)
(2) 三大特点:
① 线程安全;
② 延时加载;
③ 序列化和反序列化;
(3) 优点:避免实例对象的重复创建(可能是代码最少的模式,但是要慎用)
(4) 恶汉模式:
① 实现方法:
//恶汉模式:无无论需不需要,我都实例化(调用构造方法),以备调用
class singleEHan{
//创建静态实例
private static singleEHan single = new singleEHan();
//private构造方法
private singleEHan() {
}
//返回类自身
public singleEHan eHanMethod() {
return single;
}
}
类:private构造方法(保证其他类不能实例化),静态实例返回给调用者。
② 优点:最简单,类加载时只创建一次实例。
③ 缺点:类加载就创建,如不用,则内存浪费。
④ 适用场景:在初始化就被用到的情况(内存小)。
(5) 懒汉模式:
① 实现方法:
单线程:
//懒汉模式:针对多个线程调用
public class singleLanHan {
//创建自身被调用的静态对象
private static volatile singleLanHan singleLanHan = null;
//private构造方法
private singleLanHan() {
}
//在该方法中实例化new
public singleLanHan lanHanMethod() {
if (singleLanHan == null) {
singleLanHan = new singleLanHan();
}
//若创建,则返回本例
return singleLanHan;
}
}
考虑线程安全(双重校验锁,和volatile关键字):
(如若使用sychronized修饰同步方法,则比较慢,性能损耗较大)
1) 双重校验锁(进行两次null检查):解决了线程安全问题、实现延时加载,同时也解决了效率问题。
2) volatile关键字:“可见性”,禁止指令重排。
//懒汉模式:针对多个线程调用(双重校验锁+volatile)
public class singleLanHan {
//创建自身被调用的静态对象
private static volatile singleLanHan singleLanHan = null;
//private构造方法
private singleLanHan() {
}
//在该方法中实例化new
public singleLanHan lanHanMethod() {
//校验锁同步
if (singleLanHan == null) {
synchronized (singleLanHan.class) {
if (singleLanHan == null) {
singleLanHan = new singleLanHan();
}
}
}
//若创建,则返回本例
return singleLanHan;
}
}
② 优点:需要的时候再创建;
(6) 静态内部类:
① 实现方案:
//内部静态类:
public class singleInner {
//静态类private
private static class innerClass{
//实例化,调用构造方法
private static singleInner single= new singleInner();
}
//构造方法
private singleInner() {
}
//返回自身
public static singleInner innerMethod() {
return innerClass.single;
}
}
② 思想:在内部类中创建对象实例;
③ 优点:只要应用中不使用内部类,JVM就不会加载,因此实现了延时加载和线程安全。
(7) 枚举(Effective Java推荐,Android不推荐):
① 实现方案:
//枚举
public enum singleEnum {
single;
public void method() {
}
}
② 优点:提供了自动序列化机制。