关于单例设计模式,大家都是老生常谈的东西了,在这里做一下记录
什么是单例
单例模式是设计模式中最简单的形式之一,这一模式的目的是使得类的一个对象成为系统中的唯一实例
单例有什么好处
单例模式会阻止其他对象实例化自己的单例对象的副本,由于在系统内存中只存在一个对象,因此可以节约系统资源,单例减少了对象的创建,自然减少了堆内存的使用
什么时候用单例
一般是对于那些业务逻辑上限定不能多例只能单例的情况,比如我们浏览一些网页的时候,有的网页上面会有适时在线人数。再比如QQ上和同学聊天,不管打开多少次还是那个窗口,数据库连接池,统一的网络访问等等
单例分类
饿汉式
public class SingletonMode {
private static SingletonMode singletonMode = new SingletonMode();
private SingletonMode() {
}
public static SingletonMode getInstance() {
return singletonMode;
}
}
懒汉式
public class SingletonMode {
private volatile static SingletonMode singletonMode = null;
private SingletonMode() {
}
public static SingletonMode getInstance() {
if (null == singletonMode) {
synchronized (SingletonMode.class) {
if (null == singletonMode) {
singletonMode = new SingletonMode();
}
}
}
return singletonMode;
}
}
枚举式
public enum SingletonMode {
INSTANCE;
public void methods(){
}
}
注意:
反射和反序列化会使饿汉式和懒汉式单例完全失效(枚举方式除外)(序列化会通过反射调用无参数的构造方法创建一个新的对象)(这也是面试官问单例模式常问道的一个问题)
public class SingletonMode implements Serializable {
private volatile static SingletonMode singletonMode = null;
private SingletonMode() {
}
public static SingletonMode getInstance() {
if (null == singletonMode) {
synchronized (SingletonMode.class) {
if (null == singletonMode) {
singletonMode = new SingletonMode();
}
}
}
return singletonMode;
}
//解决反序列化单例失效问题
private Object readResolve() {
return singletonMode;
}
}