单例模式又叫做 Singleton模式,指的是一个类,在一个JVM里,只有一个实例存在。主要有两种单例模式,分别为 饿汉式单例模式 和 懒汉式单例模式。
饿汉式单例模式
原理:
package package3;
//饿汉式单例模式,实现思路:
//1. 构造方法私有化
//2. 静态类实例化对象
//3. 调用静态方法获取唯一实例
public class GiantDragon {
private GiantDragon(){} // 使用私有化静态构造方法,保证只有自己可以访问,只有自己可以 new 对象
private static GiantDragon instance = new GiantDragon(); //这里实例化对象给私有化静态引用
public static GiantDragon getInstance(){
return instance;
}
}
测试
package package3;
public class TestGiantDragon {
public static void main(String [] args){
GiantDragon t1 = GiantDragon.getInstance(); // 获得该实例
GiantDragon t2 = GiantDragon.getInstance(); // 获得该实例
System.out.println(t1 == t2); // 结果为 true,表示使用的是同一个实例
}
}
懒汉式单例模式
原理:
package package4;
// 懒汉式单例模式
public class GiantDragon {
private GiantDragon(){} //私有化构造方法,保证只有自己能够访问和创建对象
private static GiantDragon instance; // 重要区别:私有化类引用,但是没有实例化
public static GiantDragon getInstance(){
if(null == instance){
instance = new GiantDragon(); // 此处实例化
System.out.println("懒汉式单例模式——大龙被实例化");
}
return instance;
}
}
测试:
package package4;
public class TestDragon {
public static void main(String[] args) {
GiantDragon dragon = GiantDragon.getInstance(); // 获得该实例
GiantDragon dragon2 = GiantDragon.getInstance(); // 获得该实例
System.out.println(dragon == dragon2); // 结果为 true ,表示为同一个实例
}
}
使用场景
什么时候使用饿汉式,什么时候使用懒汉式?
饿汉式是立即加载的方式,无论是否会用到这个对象,都会加载。
如果在构造方法里写了性能消耗较大,占时较久的代码,比如建立与数据库的连接,那么就会在启动的时候感觉稍微有些卡顿。
懒汉式,是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量(鉴于同学们学习的进度,暂时不对线程的章节做展开)。
使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。
看业务需求,如果业务上允许有比较充分的启动和初始化时间,就使用饿汉式,否则就使用懒汉式
单例模式三要素
面试官: 什么是单例模式?
回答的时候,要答到三元素
- 构造方法私有化
- 静态属性指向实例
- public static的 getInstance方法,返回第二步的静态属性
参考资料(推荐阅读):
网友评论