单利模式的几种实现方式
1、懒汉式
public class AudioManager{
private static AudioManager instance;
private AudioManager(){}
public static AudioManager getInstance(){
if(instance == null){
instance = new AudioManager();
}
return instance;
}
}
懒汉模式的单例模式实现是线程不安全的。
2、饿汉式
public class AudioManager{
private static AudioManager instance = new AudioManger;
private AudioManager(){}
public static AudioManager getInstance(){
return instance;
}
}
这个是用空间换取时间,类被创建的时候就会实例化,是线程安全的
3、懒汉式线程安全实现方式,双重验证,加锁
public class AudioManager{
private static AudioManager instance;
private AudioManager(){}
public static AudioManager getInstance(){
if (instance == null){ synchronized (AudioManager.class){ if (instance==null){ instance = new AudioManager(); } } } return instance;
}
}
4、内部静态类的方式实现单例模式
public class AudioManager{
private static class AudioInner{
private static AudioManager instance = new AudioManager();
}
private static AudioManager instance;
private AudioManager(){}
public static AudioManager getInstance(){
return AudioInner.instance;
}
}
静态内部类是通过jvm保证线程安全的
5、使用枚举实现单例模式
public enum AudioManager{
instance;//instance 就代表audioManager的一个对象实例
}
破坏单例模式有三种方式 反射、序列化、clone,解决方式有检测有两个对象时抛出异常,重写clone方法, 添加readResolve(),返回Object对象
二、观察者模式
观察者模式应用广泛,例如Android中按钮的点击事件,广播等
用语言描述其实很简单,被观察者维护一个任务队列,任务队列中的任务是监听回调对象,被观察者对外暴露注册监听和解绑监听的方法,在注册监听中需要传一个监听回调对象,被观察者将监听对象添加到任务队列中,当被观察者发生变化时就遍历任务队列通过监听回调通知观察者。
注单例模式参考链接 https://blog.csdn.net/fd2025/article/details/79711198