设计模式面试题-单例模式【JavaPub版】

简介: 设计模式面试题-单例模式【JavaPub版】

单例模式是面试中很常问的问题,一般在面试 web 岗位时,可能会涉及算法较少,手写单例模式时有发生,前段金三银四有个朋友在跳槽时有三家都是让现场手写一个。

如果想直接对线面试官代码,建议看文末的·方法五

有什么好处:

  1. 了解应聘者编码能力
  2. 观察应聘者思维缜密程度

言归正传,看看单例模式到底怎么写

单例(Singleton)模式的定义:

指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。

单例模式有 3 个特点:

  1. 单例类只有一个实例对象;
  2. 该单例对象必须由单例类自行创建;
  3. 单例类对外提供一个访问该单例的全局访问点。

单例模式的结构与实现

单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过 “new 构造函数()” 来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。

使用场景:

  1. 要求生产唯一序列号。
  1. WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  2. 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。(这个应该是使用最广泛的场景,有时我们会创建一个kafka客户端、或者其他的客户端会使用到单例模式)

到底怎么写?

方法一:

简易版:大家第一种想到的方式,肯定是这样

public class SingleObjectJavaPub {
 
   //创建 SingleObject 的一个对象
   private static SingleObjectJavaPub instance = new SingleObjectJavaPub();
 
   //让构造函数为 private,这样该类就不会被实例化
   private SingleObjectJavaPub(){}
 
   //获取唯一可用的对象
   public static SingleObjectJavaPub getInstance(){
      return instance;
   }
}

方法二:

懒汉模式,线程不安全,这种方式 lazy loading 很明显

public class SingletonJavaPub {  
    private static SingletonJavaPub instance;  
    private SingletonJavaPub(){}  
  
    public static SingletonJavaPub getInstance() {  
    if (instance == null) {  
        instance = new SingletonJavaPub();  
    }  
    return instance;  
    }  
}

方法三:

懒汉式,线程安全,加了 synchronized ,加锁一定会影响效率,但是 getInstance() 的性能对应用程序不是很关键的情况(该方法使用不太频繁)。

public class SingletonJavaPub {  
    private static SingletonJavaPub instance;  
    private SingletonJavaPub(){}  
    public static synchronized SingletonJavaPub getInstance() {  
    if (instance == null) {  
        instance = new SingletonJavaPub();  
    }  
    return instance;  
    }  
}

方法四:

饿汉式,这个是比较难一点理解的,静态方法在初始化时,可能有很多因素。

它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。

public class SingletonJavaPub {  
    private static SingletonJavaPub instance = new SingletonJavaPub();  
    private SingletonJavaPub(){}  
    public static SingletonJavaPub getInstance() {  
        return instance;  
    }  
}

方法五:

双检锁/双重校验锁(DCL,即 double-checked locking)

这种方式采用双锁机制,安全且在多线程情况下能保持高性能。getInstance() 的性能对应用程序很关键的情况。

public class SingletonJavaPub {  
    private volatile static SingletonJavaPub singleton;  
    private SingletonJavaPub (){}  
    public static SingletonJavaPub getSingleton() {  
        if (singleton == null) {  
            synchronized (SingletonJavaPub .class) {  
                if (singleton == null) {  
                    singleton = new SingletonJavaPub();  
                }  
            }  
        }  
        return singleton;  
    }  
}

参考:


https://blog.csdn.net/weixin_45429720/article/details/108943032?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-13.baidujsUnder6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-13.baidujsUnder6

https://www.runoob.com/design-pattern/singleton-pattern.html

目录
相关文章
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
427 15
|
11月前
|
设计模式 算法 架构师
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
159 2
|
设计模式 安全 Java
设计模式:单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。它通过私有化构造函数、自行创建实例和静态方法(如`getInstance()`)实现。适用于数据库连接池、日志管理器等需要全局唯一对象的场景。常见的实现方式包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。线程安全问题可通过`synchronized`或双重检查锁解决,同时需防止反射和序列化破坏单例。优点是避免资源浪费,缺点是可能增加代码耦合度和测试难度。实际开发中应优先选择枚举或静态内部类,避免滥用单例,并结合依赖注入框架优化使用。
|
设计模式 存储 安全
设计模式2:单例模式
单例模式是一种创建型模式,确保一个类只有一个实例,并提供全局访问点。分为懒汉式和饿汉式: - **懒汉式**:延迟加载,首次调用时创建实例,线程安全通过双重检查锁(double check locking)实现,使用`volatile`防止指令重排序。 - **饿汉式**:类加载时即创建实例,线程安全但可能浪费内存。 示例代码展示了如何使用Java实现这两种模式。
318 4
|
设计模式 存储 安全
设计模式-单例模式练习
单例模式是Java设计模式中的重要概念,确保一个类只有一个实例并提供全局访问点。本文详解单例模式的核心思想、实现方式及线程安全问题,包括基础实现(双重检查锁)、懒汉式与饿汉式对比,以及枚举实现的优势。通过代码示例和类图,深入探讨不同场景下的单例应用,如线程安全、防止反射攻击和序列化破坏等,展示枚举实现的简洁与可靠性。
214 0
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
660 13
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
228 2
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
252 4
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式