认识设计模式(一)---单例模式(7)
(一)懒汉式(枚举)
这种方式是Effective Java作者Josh Bloch提倡的方式,推荐使用
(1)单例类代码如下:
enum Singleton07{
INSTANCE;
public void sayOK(){
System.out.println("ok-");
}
}
(2)测试类代码如下
public class SingletonTest07 {
public static void main(String[] args) {
Singleton07 instance01=Singleton07.INSTANCE;
Singleton07 instance02=Singleton07.INSTANCE;
System.out.println(instance01==instance02);
System.out.println("instance01-hashCode="+instance01.hashCode());
System.out.println("instance02-hashCode="+instance02.hashCode());
instance01.sayOK();
}
}
(二)优缺点分析
- 借助JDK1.5里添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且能放置反序列化重新创建新的对象
(三)区别
Singleton06 instance01=Singleton06.getInstance();
Singleton06 instance02=Singleton06.getInstance();
调用方式改成了
Singleton07 instance01=Singleton07.INSTANCE;
Singleton07 instance02=Singleton07.INSTANCE;
为什么使用枚举?
枚举在java中与普通类一样,都能拥有字段与方法,而且枚举实例创建是线程安全的,在任何情况下,它都是一个单例。我们可直接以SingleTon.INSTANCE的方式调用
(四)单例模式在JDK应用的源码分析
java.lang.RunTime是典型的单例模式(饿汉式)
//是饿汉式(线程不安全)
public class Runtime {
//1-私有的构造器,外部无法实例化对象
private Runtime() {
}
//2-本类内部创建私有的、静态的、final的对象实例,并且初始化
private static final Runtime currentRuntime = new Runtime();
private static Runtime.Version version;
//3-暴露一个公有的getRuntime方法,可以获取对象实例
public static Runtime getRuntime() {
return currentRuntime;
}
....
}