继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

设计模式面试必看之单例模式

小强聊架构
关注TA
已关注
手记 40
粉丝 9455
获赞 241

假设在面试中,有面试官提问,写一段单例模式的示例代码吧。
其实不要觉得简单,用好单例模式没有那么简单。

作者就曾出过这样一道题,结果好多同学一听觉得很简单,但实际写出来的代码却千奇百怪。

下面介绍下单例模式的要点,不为面试,为了更好的写出漂亮的代码。

使用场景:

单例模式,保证在java中,一个类class只有一个实例存在。
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”

为什么要使用:

对于系统中某些class,只有一个实例很重要。比如Windows系统的任务管理器,打印机的任务调度程序,同时,可以节约内存使用。

使用方法:

有三种形式:

  • Common initialization
public class Singleton {

  private Singleton(){}

  //注意这是private 只供内部调用
  private static Singleton instance = new Singleton();

  //这里提供了一个供外部访问本class的静态方法,可以直接访问  
  public static Singleton getInstance() {
    return instance;   
   } 
}
  • lazy initialization
public class Singleton { 

  private static Singleton instance = null;
       //此处,synchronized 很重要。
  public static synchronized Singleton getInstance() {

  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率,但是没有第一种形式安全。
  if (instance==null)
    instance=new Singleton();
  return instance;   
     } 

}
  • double-check+synchronized
public class Singleton{
    private static volatile Singleton instance=null;
    private Singleton(){
        //do something
    }
    public static  Singleton getInstance(){
       //双重判断+同步块的方法,可以大大提高效率。
        if(instance==null){
            //将同步块放到方法的内部,提高了执行效率
            synchronized(Singleton.class){
                if(instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
     }
}

欢迎评论并讨论哈!

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP