面试突击50 单例模式有几种写法 (面试突击班)
本文目录导航:
面试突击50:单例模式有几种写法?
单例模式是面试中的常客了,它的常见写法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举,接下来我们一一来看。

饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader 类机制,在程序启动时只加载一次,因此不存在线程安全问题,它的实现代码如下:
public class Singleton {// 1.防止外部直接 new 对象破坏单例模式private Singleton() {}// 2.通过私有变量保存单例对象private static Singleton instance = new Singleton();// 3.提供公共获取单例对象的方法public static Singleton getInstance() {return instance;}}
优点:实现简单、不存在线程安全问题。
缺点:类加载时就创建了对象,创建之后如果没被使用,就造成了资源浪费的情况。
懒汉模式和饿汉模式正好是相反的,所谓的懒汉模式也就是懒加载(延迟加载),指的是它只有在第一次被使用时,才会被初始化,它的实现代码如下:
public class Singleton {// 1.防止外部直接 new 对象破坏单例模式private Singleton() {}// 2.通过私有变量保存单例对象private static volatile Singleton instance = null;// 3.提供公共获取单例对象的方法public static Singleton getInstance() {if (instance == null) { // 第一次效验synchronized () {if (instance == null) { // 第二次效验instance = new Singleton();}}}return instance;}}懒汉模式使用的是双重效验锁和 volatile 来保证线程安全的,从上述代码可以看出,无论是饿汉模式还是懒汉模式,它们的实现步骤都是一样的:
创建一个私有的构造方法,防止其他调用的地方直接 new 对象,这样创建出来的对象就不是单例对象了。
创建一个私有变量来保存单例对象。
提供一个公共的方法返回单例对象。
懒汉模式相比于饿汉模式来说,不会造成资源的浪费,但写法要复杂一些。
3.静态内部类静态内部类既能保证线程安全,又能保证懒加载,它只有在被调用时,才会通过 ClassLoader 机制来加载和初始化内部静态类,因此它是线程安全的,此模式的实现代码如下:
public class Singleton {// 1.防止外部直接 new 对象破坏单例模式private Singleton() {}// 2.静态内部类private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}// 3.提供公共获取单例对象的方法public static final Singleton getInstance() {return ;}}4.枚举枚举也是在第一次被使用时,才会被 Java 虚拟机加载并初始化,所以它也是线程安全的,且是懒加载的,它的实现代码如下:
public enumEnumSingleton {INSTANCE;public EnumSingleton getInstance(){return INSTANCE;}}总结
单例模式适用于经常被访问的对象,或是创建和销毁需要调用大量资源和时间的对象,使用单例模式可以避免频繁创建和销毁对象。
单例模式的常用实现方法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举。
从写法的简洁性、线程安全性和代码的易懂性等方面综合来看,博主比较推荐使用枚举或懒汉模式来实现单例模式。
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java面试真题解析
面试合集:原文:
如何在Java中实现单例模式?
单例模式大致有五种写法,分别为懒汉,恶汉,静态内部类,枚举和双重校验锁。
1、懒汉写法,常用写法
python实现单例模式的五种写法,你都会吗?
探讨Python实现单例模式的五种方法,逐一剖析其特点与适用场景。
单例模式确保一个类在程序中仅有一个实例存在,且提供一个全局访问点。
实现方法如下:方法1:静态内部类方式。
通过在类内部定义一个静态方法返回类实例,确保全局访问的唯一性。
方法2:装饰器模式。
利用装饰器函数在类的实例化之前检查实例是否已存在,如果存在则返回已有的实例,否则创建新实例。
方法3:全局变量模式。
将实例作为全局变量存储,确保所有代码段都能访问同一实例。
需注意线程安全问题。
方法4:元类方式。
通过元类(metaclass)在类定义时检查实例是否存在,如果不存在则创建新实例。
方法5:使用弱引用。
此方法利用Python的弱引用特性,避免循环引用导致的垃圾回收问题,仅在无循环引用场景下有效。
优点在于类方法中无需通过self.__class__获取实例,直接使用self即可。
然而,方法5需谨慎使用,以防循环引用导致单例实例被误回收。