`
yuxuan1215
  • 浏览: 14063 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDK中的设计模式之单例模式

 
阅读更多

1JDK中单例模式的体现

首先看一下一段JDK 源码中的Runtime类的一段代码

public class Runtime {
    private static Runtime currentRuntime = new Runtime();
    public static Runtime getRuntime() { 
	return currentRuntime;
    }
    private Runtime() {}
 }

从这段代码中我们能看出来每个java应用程序在在什么情况下运行,都会有一个唯一的Runtime实例对象 通过调用静态方法getRuntime()来获得这个唯一的实例,而且Runtime的构造方法是私有的,该Runtime持有对自己的引用,这就是最简单的一种设计模式单例模式啦,相信大家在面试的过程中会经常被问到你最熟悉的设计模式是什么,它在什么地方有所体现,相信这可以使一个好的回答了。

2 单例模式


通过上面的实例可以看出单例类具备以下几个特点:

  • 单例类只能有一个实例
  • 单例类必须自行创建这个实例
  • 单例类必须自行向整个系统提供这个实例


3饿汉式单例模式

在本文最开始的那段代码就是饿汉式单例模式的一个体现,在java语言中通常用到的都是饿汉式单例,下面给出饿汉式单例的通用代码:

public class Singleton {
	private static Singleton singleton = new Singleton() ;
	private Singleton(){}
	public static Singleton getInstance(){
		return singleton;
	}
}
下面写个测试,通过getInstance()获得两个Signgleton对象,判断是否相等

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s2==s1);

从打印的结果为true我们看以看出s1与s2连个实例是同一个对象。 之所以被称作是饿汉式单例,从上面也可以看出,这个Singleton类被加载时,静态变量singleton就会被初始化,此时Singleton类的私有构造函数就会被调用在此时单例类的实例就被创建出来了,看来确实够饿的,在类加载时就把实例唯一的实例创建出来

4懒汉式单例模式

  与饿汉式单例不同的是,懒汉式单例在第一次引用时将单例的实例创建出来,他们的相同之处就是类的够着函数都是私有的,下面看下懒汉式单例的代码实现:
public class Singleton {
	private static Singleton singleton;
	private Singleton(){}
	public static Singleton getInstance(){
		if(singleton ==null){
			singleton = new Singleton();
		 }
		return singleton;
	}
}
同样测试,看以可出创建的实例也是同一个
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s2==s1);

5饿汉式单例和懒汉式单例的比较

  从上述两端代码中也可以看出,饿汉式单例在类加载时就创建了单例的实例,从资源利用的角度来看,肯定会比懒汉式单例差些,但是反观从时间和反应速度上,却比懒汉式单例好些,饿汉式单例更符合java语言的设计观点,在处可以参照《java与模式》,书中阐述了两种单例模式的比较,以及懒汉式单例在多线程首次同时引用此类时访问限制问题。

6讨论:单例模式的构造函数必须私有的吗?

7单例模式的使用情景
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics