一、定义
作为对象的创建模式,单例模式确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。
二、单例模式特点
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给其他对象提供这一实例
三、饿汉式单例类
饿汉式单例类类图如下
示例代码:
public class EagerSingleton {
//类被加载时静态变量会被初始化
private static final EagerSingleton m_instance = new EagerSingleton();
//私有的构造方法,保证其他类无法new 出一个新的对象。此类不可被继承
private EagerSingleton() {
}
//静态工厂方法,供其他类获取这个类的唯一实例
public static EagerSingleton getInstance() {
return m_instance;
}
}
在类被初始化的时候,静态变量m_instance就会初始化,私有的构造方法被调用,这是单例类的唯一实例就被创建出来了。
四、懒汉式单例类
懒汉式单例类的类图如下
示例代码:
public class LazySingleton {
//将实例初始化为null,用到此实例时再创建
private static LazySingleton m_instance = null;
//私有化构造方法,保证外界无法直接实例化
private LazySingleton() {
}
//执行此方法是需要同步,防止多线程的情况下出现错误
synchronized public static LazySingleton getInstance() {
if(m_instance==null) {
m_instance = new LazySingleton();
}
return m_instance;
}
}
注意:1、从资源利用角度讲,懒汉式单例类优于饿汉式单例类 2、从反应时间和速度的角度讲,饿汉式单例类优于懒汉式单例类
五、单例模式在Java源码中的应用
- java.lang.RunTime
public class Runtime {
private static final Runtime currentRuntime = new Runtime();
private static Version version;
public static Runtime getRuntime() {
return currentRuntime;
}
private Runtime() {
}
//其余代码省略
.........
}