-
应用场合:
当某些类只需要被创建一个对象时,需要单例模式.
-
作用:
保证应用程序中某些类的实例有且只有一个.
-
类型:
饿汉模式、懒汉模式
饿汉模式
在类加载时,就创建了这个类的唯一实例.
代码如下:
public class HungrySingleton {
/**
* 饿汉模式:在类加载的时候,就会创建这个类的唯一实例,这种叫饿汉模式
*/
//1,将构造方法私有化,不允许外部直接创建对象
private HungrySingleton(){}
//2.创建此类的唯一实例,使用private static修饰
private static HungrySingleton instance = new HungrySingleton();
//3.提供一个用于获取实例的方法,使用public static修饰
public static HungrySingleton getInstance(){
return instance;
}
}
测试:
/**
* 测试饿汉模式
*/
@Test
public void testHungrySingleton(){
HungrySingleton instance1 = HungrySingleton.getInstance();
HungrySingleton instance2 = HungrySingleton.getInstance();
if (instance1 == instance2){
System.out.println("创建的是一个实例,符合单例");
}else{
System.out.println("不是同一个实例");
}
}
测试结果:
结论:
使用单例模式时,外部无论引用多少次这个实例,都是引用的同一个实例(对象);
so ->> 饿汉模式在加载类的时候比较慢,但运行时获取对象的速度比较快,并且线程安全
懒汉模式
不在类加载时初始化,在需要引用对象的时候初始化
代码如下:
public class LazySingleton {
//1。将构造方法私有化
private LazySingleton(){};
//2. 声明类的唯一实例,使用private static修饰,并不初始化
private static LazySingleton instance;
//3.提供一个用于获取实例的方法,使用public static修饰
public static LazySingleton getInstance(){
if (instance == null){
instance = new LazySingleton();
}
return instance;
}
}
测试:
/**
* 测试懒模式
*/
@Test
public void testLazySingleton(){
LazySingleton instance1 = LazySingleton.getInstance();
LazySingleton instance2 = LazySingleton.getInstance();
if (instance1 == instance2){
System.out.println("创建的是一个实例,符合单例");
}else{
System.out.println("不是同一个实例");
}
}
测试结果:
结论:
相较于饿汉模式而言,懒汉模式不在类加载的时候初始化,而是在被引用的时候初始化。
so ->> 懒汉模式在加载类的时候比较快,但运行时获取对象的速度比较慢,并且线程不安全