单例及应用场景深层次解读

很多同学去面试的时候,经常会被问到对单例的理解。当然,单例比较简单,同学们也基本能弄清楚单例的概念。但一些深层次的内容,有些同学可能理解得还不太够,例如单例的优势、使用场景等。今天就给大家全面阐述一下单例模式。

一. 生活案例

相信很多小伙伴都知道,国家早几年实行的计划生育政策, 规定一对夫妇只生一胎。刚结婚时只能生一胎,生完后就不能再生,否则就会违背国家政策。

二. 程序概念

而我们所谓单例设计模式,简单地说就是无论程序如何运行,采用单例设计模式的类(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 小节

综上所述,当类中有很多个单例对象,但并不是都必须立即使用,那么就选择懒汉式比较好;如果类中的单例对象基本都会被立即使用到,且考虑多线程的情况,应该选择饿汉式的设计。

扫码开启学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马剑威(威哥爱编程)

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值