单例工具 - Singleton
# 单例工具 - Singleton
# 1. 简介
在日常开发中,我们常常需要使用单例模式来确保一个类只有一个实例。在传统的单例实现中,我们通常通过以下两种方式实现单例:
- 静态方法
getInstance()
:在类中添加一个静态方法,返回单例实例。这种方式可以通过懒汉模式或饿汉模式来实现。 - 使用依赖注入框架:如 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
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
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
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
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