Java中的设计模式-单例模式2

Java中的设计模式-单例模式2@TOC


前言

上篇回顾,写到了用懒汉式和饿汉式去实现单例模式,也写了中间有一定的问题存在。这一边主要其他单例模式的实现

一、双检锁

特点线程安全,懒加载,代码如下:Java中的设计模式-单例模式2

二、静态内部类

特点线程安全,懒加载,代码如下:
Java中的设计模式-单例模式2静态内部类也是能达到与双重锁一样的功效。

三.枚举

Java中的设计模式-单例模式2
这方式是最简单实现单例模式的,但是这方式用的很少,枚举类继承于java.lang.Enum。如果他通过反射去创建一个对象会怎么样?
Java中的设计模式-单例模式2可见在枚举类是不支持反射创建。Java中的设计模式-单例模式2如果使用继承了java.lang.Enum这个抽象类,说明这个对象也是有被序列化的。

四.序列化的单例模式

在我们的开发中可能一些的需求 比如在网络中传输这个类:如将这个类存入redis中,让这个类可序列化。比如在Java中可以将实现java.io.Serializable,实现完成后需要给定这个类版本号
static final long serialVersionUID = 42L;
只有确定了版本号才能保证他的序列化和反序列化的对象是同一个对象。
这里我用静态内部类的方式演示:
Java中的设计模式-单例模式2Java中的设计模式-单例模式2经过测试的反序列化的对象和创建的对象不是同一个实例。

通过反序列化的方式创建实例 他不会调用我们自定义的构造函数创建方式。他直接通过字节流的方式拿到数据。
Java中的设计模式-单例模式2

在java.io.Serializable中有一个方案,如果这个实例是从流中读取的你可以使用这个方法区代替你拿数据的方式。
Java中的设计模式-单例模式2
Java中的设计模式-单例模式2这样的反序列化拿到的对象也是单例对象。

五.结束语

单例模式的几种方式我都呈现出来了,其中存在的一些问题(如:反射创建,多线程,序列化)的问题也有一定的解答。单例模式就讲到这。如果文章中有内容有误,不懂,不好的地方还请多多指教。