很多同学去面试的时候,经常会被问到对单例的理解。当然,单例比较简单,同学们也基本能弄清楚单例的概念。但一些深层次的内容,有些同学可能理解得还不太够,例如单例的优势、使用场景等。今天就给大家全面阐述一下单例模式。
一. 生活案例
相信很多小伙伴都知道,国家早几年实行的计划生育政策, 规定一对夫妇只生一胎。刚结婚时只能生一胎,生完后就不能再生,否则就会违背国家政策。
二. 程序概念
而我们所谓单例设计模式,简单地说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生。相当于一个类只能有一个“孩子”,所以单例模式就属于符合计划生育的政策要求。那单例是怎么保证一个类只能生一个“孩子”呢?具体实现步骤如下:
(1). 构造方法私有化(采用private修饰);
(2). 使用静态方法调用得到单例模式对象。
1.示例代码
class Singleton {
//private static Singleton instance = new Singleton();// 饿汉式
private static Singleton instance; //饿汉式
public static Singleton getInstance() {
if(instance==null){
instance = new Singleton();
}
return instance;
}
private Singleton() { // 构造方法封装为私有化
}
}
public class Test2 {
public static void main(String args[]) {
Singleton s = Singleton.getInstance(); //两个对象一致
Singleton s2 = Singleton.getInstance();
System.out.println(s==s2); //true 同一个对象
}
}
2.单例作用
从上面的案例可以看出,不管是单例的饿汉式还是懒汉式,最终会保证一个类只能得到同一个对象,所以使用单例的好处显而易见,就是确保只能产生一个类对象,所以就可以节省内存资源。
3.应用场景
在学习前面的课程时,可能有很多同学不理解,单例在实际开发中到底有哪些用处?其实不管是在Web开发,还是SSM框架中,单例设计模式都随处可见。给你举个简单例子,例如:多个用户访问淘宝网站,如果不是单例设计,那么每个人的访问,都会创建一个独立的对象,这就大大地浪费了内存资源。
4.懒汉式 VS 饿汉式
同学们也看到了,上面代码中的单例模式分为懒汉式和饿汉式两种情况。我经常听到有的同学对两种情况的区别,理解为懒汉式是线程不安全,而饿汉式是线程安全的,但并不理解两者的具体优缺点在哪,接下来就再说一下两者的具体区别。
4.1 饿汉式
饿汉式无需关注多线程问题,写法简单明了,可以直接在类中实例化静态对象。但它是在加载类时就要创建实例,所以如果类中有很多个单例对象,可能我暂时是用不到的,但也进行了创建,反而会浪费资源。
4.2 懒汉式
懒汉式的优势在于可以延时加载,也就是说可能有些单例对象没有使用时,我就不需要创建此对象,只有在调用时才创建出对象,但该方式在多线程时并不安全。
4.3 小节
综上所述,当类中有很多个单例对象,但并不是都必须立即使用,那么就选择懒汉式比较好;如果类中的单例对象基本都会被立即使用到,且考虑多线程的情况,应该选择饿汉式的设计。
扫码开启学习