单例设计模式

单例设计模式

单例设计模式是一种常见的软件设计模式,它能保证一个类只能有一个实例,并提供一个全局访问的方法。单例设计模式适用于那些需要频繁创建对象然后销毁对象的场景,因为频繁的创建对象会消耗大量的系统资源,使用单例设计模式可以避免对资源的浪费。

单例设计模式特点:

  • 该类在JVM中只有唯一的类实例
  • 它必须对外界提供统一的,获取该类实例的方法

在Java中,实现单例设计模式分为多种:

  1. 饿汉式:在类加载阶段时就创建实例,该模式下不会出现线程安全问题,因此并不需要加锁,如下面的代码
public class Main {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getSingleton();
        Singleton singleton2 = Singleton.getSingleton();

        System.out.println(singleton1);
        System.out.println(singleton2);
    }
}

class Singleton {
    private static final Singleton singleton = new Singleton();
    private Singleton() {}
    public static Singleton getSingleton() {
        return singleton;
    }
}

运行结果如下:

leetcode.Singleton@58372a00
leetcode.Singleton@58372a00
  1. 懒汉式:懒汉式指的是在第一次使用该类实例时才创建该类实例,这种方式的好处是可以延迟加载,缺点是在多线程下可能会引起线程安全问题,例如创建该类的多个实例,从而违背了单例设计模式的特性。因此在使用懒汉式需要在创建该类实例时需要加上锁,如下面的代码:
public class Main {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getSingleton();
        Singleton singleton2 = Singleton.getSingleton();

        System.out.println(singleton1);
        System.out.println(singleton2);
    }
}

class Singleton {
    private static Singleton singleton;

    private Singleton() {}

    public synchronized static  Singleton getSingleton() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

代码运行结果如下:

leetcode.Singleton@7ba4f24f
leetcode.Singleton@7ba4f24f
  1. 懒汉式2(静态内部类方式)

当然了,除了上面那种常用的懒汉式创建单例的方法,也可以通过内部类方式通过懒汉式创建单例实例,这种本质上还是懒汉式,如下面的代码:

public class Main {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getSingleton();
        Singleton singleton2 = Singleton.getSingleton();

        System.out.println(singleton1);
        System.out.println(singleton2);
    }
}

class Singleton {

    private static class Builder {
        private static final Singleton singleton = new Singleton();
    }

    private Singleton() {}

    public synchronized static  Singleton getSingleton() {
        return Builder.singleton;
    }
}

运行结果如下:

leetcode.Singleton@3b9a45b3
leetcode.Singleton@3b9a45b3
  1. 通过枚举实现(推荐用法)

枚举本质上就是单例模式的一种体现,其思路也是懒汉式,枚举之所以能够作为单例,原因如下:

4.1 线程安全性:枚举类型的实例化是在JVM层面完成的,因此枚举类实例化是线程安全的。当JVM加载枚举类时,JVM会确保所有声明的枚举类仅初始化一次,并且在这个过程中不会发生并发问题。

4.2 防止反射攻击:Java枚举类的构造器是私有的,并且Java不允许通过反射机制创建新的枚举示例,这也就意味着一旦定义了一个枚举实例,就无法通过反射以及其它手段创建该枚举类的额外实例。

4.3 代码简洁:枚举的语法非常的简洁,如下面的代码:

public class Main {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.INSTANCE;
        Singleton singleton2 = Singleton.INSTANCE;
        System.out.println(singleton2 == singleton1);
    }
}

enum Singleton {
    INSTANCE;
}
posted @   LilyFlower  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
点击右上角即可分享
微信分享提示