程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 克隆

  • 类型转换

  • 日期时间

  • IO流相关

  • 工具类

  • 语言特性

    • HashMap扩展 - `Dict`
    • 单例工具 - `Singleton`
      • 1. 简介
      • 2. 主要方法
        • get(Class clazz)
        • 示例:获取单例实例
        • remove(Class clazz)
        • 示例:移除单例实例
        • destroy()
        • 示例:销毁所有单例实例
        • 支持带参数的构造方法
        • 示例:带参数的单例实例
    • 断言工具 - `Assert`
    • 二进码十进数工具 - `BCD`
    • 控制台打印封装工具 - `Console`
    • 字符串格式化工具 - `StrFormatter`
    • 树结构工具 - `TreeUtil`
  • JavaBean

  • 集合类

  • Map

  • Codec编码

  • 文本操作

  • 注解

  • 比较器

  • 异常

  • 数学

  • 线程和并发

  • 图片

  • 网络

  • 源码编译

  • 配置文件

  • 日志

  • 缓存

  • JSON

  • 加密解密

  • DFA查找

  • HTTP客户端

  • 定时任务

  • 扩展

  • 切面

  • 脚本

  • Office文档操作

  • 系统调用

  • 图形验证码

  • 网络Socket

  • JWT

  • Hutoll
  • 语言特性
scholar
2024-08-20
目录

单例工具 - Singleton

# 单例工具 - Singleton

# 1. 简介

在日常开发中,我们常常需要使用单例模式来确保一个类只有一个实例。在传统的单例实现中,我们通常通过以下两种方式实现单例:

  1. 静态方法 getInstance():在类中添加一个静态方法,返回单例实例。这种方式可以通过懒汉模式或饿汉模式来实现。
  2. 使用依赖注入框架:如 Spring,通过依赖注入的方式管理单例实例,但这种方式更注重对象的注入和生命周期管理,而不是直接获取实例。

Singleton 工具类提供了一种更灵活的方式来管理和获取单例实例。它通过一个内部的线程安全的 ConcurrentHashMap 来存储单例对象,用户可以通过类的类型来获取对应的单例实例,并且支持懒汉模式的实现。

# 2. 主要方法

# get(Class<T> clazz)

根据传入的类获取对应的单例实例。如果该实例不存在,则创建一个新的实例并存入池中。如果该实例已经存在,则直接返回。

# 示例:获取单例实例

import cn.hutool.core.lang.Singleton;

public class SingletonExample {
    // 动物接口
    public interface Animal {
        void say();
    }

    // 狗的实现
    public static class Dog implements Animal {
        @Override
        public void say() {
            System.out.println("汪汪");
        }
    }

    // 猫的实现
    public static class Cat implements Animal {
        @Override
        public void say() {
            System.out.println("喵喵");
        }
    }

    public static void main(String[] args) {
        // 获取单例实例
        Animal dog = Singleton.get(Dog.class);
        Animal cat = Singleton.get(Cat.class);

        // 验证单例:每次获取的对象是同一个
        System.out.println(dog == Singleton.get(Dog.class));  // true
        System.out.println(cat == Singleton.get(Cat.class));  // true

        // 调用实例方法
        dog.say();  // 输出:汪汪
        cat.say();  // 输出:喵喵
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  • 作用:get(Class<T> clazz) 方法根据类类型获取单例实例,在实例不存在时自动创建新实例并进行缓存。
  • 实际开发场景:在需要统一管理和获取单例实例的场景下,比如全局配置管理、缓存管理、日志管理等。

# remove(Class<T> clazz)

从单例池中移除指定类型的实例,通常用于销毁或重新创建单例对象。

# 示例:移除单例实例

import cn.hutool.core.lang.Singleton;

public class SingletonExample {
    public static void main(String[] args) {
        // 获取单例实例
        Animal dog = Singleton.get(Dog.class);

        // 移除单例实例
        Singleton.remove(Dog.class);

        // 再次获取时会创建新的实例
        Animal newDog = Singleton.get(Dog.class);
        System.out.println(dog == newDog);  // false
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • 作用:remove(Class<T> clazz) 方法移除指定类型的单例实例,用于销毁单例或重置实例。
  • 实际开发场景:在需要重新初始化单例对象或清理资源时,可以使用此方法。

# destroy()

清空整个单例池,销毁所有单例实例。

# 示例:销毁所有单例实例

import cn.hutool.core.lang.Singleton;

public class SingletonExample {
    public static void main(String[] args) {
        // 获取单例实例
        Animal dog = Singleton.get(Dog.class);
        Animal cat = Singleton.get(Cat.class);

        // 销毁所有单例实例
        Singleton.destroy();

        // 再次获取时会重新创建实例
        Animal newDog = Singleton.get(Dog.class);
        Animal newCat = Singleton.get(Cat.class);
        System.out.println(dog == newDog);  // false
        System.out.println(cat == newCat);  // false
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 作用:destroy() 方法清空所有的单例实例,用于彻底清理资源或重置系统状态。
  • 实际开发场景:在应用退出或系统重置时,可以使用此方法来清理所有单例实例,确保系统资源的释放。

# 支持带参数的构造方法

Singleton 工具类不仅支持无参构造方法,还支持带参数的构造方法。你可以通过 get 方法传递参数来创建单例对象。

# 示例:带参数的单例实例

import cn.hutool.core.lang.Singleton;

public class SingletonExample {
    // 带参数的单例类
    public static class Person {
        private final String name;

        public Person(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

    public static void main(String[] args) {
        // 获取带参数的单例实例
        Person person = Singleton.get(Person.class, "Alice");
        System.out.println(person.getName());  // 输出:Alice

        // 验证单例:每次获取的对象是同一个
        Person samePerson = Singleton.get(Person.class, "Alice");
        System.out.println(person == samePerson);  // true
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  • 作用:支持带参数的构造方法,可以灵活创建需要初始化参数的单例实例。
  • 实际开发场景:在需要根据不同参数创建单例对象时非常有用,比如需要在单例创建时传递配置信息或初始化数据。

总结

Singleton 工具类通过一个安全的 ConcurrentHashMap 作为单例对象池,提供了灵活的单例管理方式。它不仅支持无参构造的单例对象,还支持带参数的单例对象,并且具备良好的线程安全性和性能。相比传统的单例实现方式,Singleton 工具类更加简洁且易于扩展,在实际开发中具有广泛的应用场景。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
HashMap扩展 - `Dict`
断言工具 - `Assert`

← HashMap扩展 - `Dict` 断言工具 - `Assert`→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式