Java创建通⽤单例⼯具类(泛型)
1.情景展⽰
  我们在接触单例设计模式的时候,只能创建简单的单例,也就是哪个Java类需要控制成单例,就写⼀个对应的⼯具类。例如:
  如上图所⽰,就是单例的表现形式之⼀:饿汉式(也就是不管你需不需,我先创建⼀个对象再说,你要我就给,不要我也已经创建好了);
  创建单例,我们需要将构造⽅法私有化,这样就可以保证调⽤该类时⽆法通过new来创建对象;
  另外,创建getInstance()⽅法,并需要被synchronized关键字修饰,以确保该对象同⼀时间只能被⼀个线程调⽤。
  那么,当我们有创建⼤量单例的需求时,总不能需要⼏个就写对应的类吧,这样不仅降低代码的可维护性,还会影响开发效率。
2.原因分析
  通过泛型来实现
3.解决⽅案
import java.util.HashMap;
import java.util.Map;
/
**
* 单例模式+泛型
* @description 所有的类都可以调⽤该类⽣成唯⼀的Java实例化对象
* 调⽤者需要继承该类,调⽤⽅法如下:
* MySingleton s = (MySingleton) Instance(MySingleton.class);
* @author: Marydon
* @date: 2020年07⽉13⽇ 0013 19:35
*/
public class SingletonUtils {
java单例模式懒汉和饿汉
//类初始化时,不初始化这个对象(延时加载,真正⽤的时候再创建)
private static Map<Class<? extends SingletonUtils>, SingletonUtils> INSTANCES_MAP = new HashMap<>();
/*
* ⽆参构造⽅法
* @attention: 这⾥不能再⽤private修饰了,因为该类是⽗类
* @date: 2020年09⽉18⽇ 0018 10:20
*/
protected SingletonUtils() {
}
/*
* 单例(懒汉式)
* @date: 2020年07⽉13⽇ 0013 19:50
* @param: instanceClass
* @return: h.ls.Singleton
*/
public synchronized static <E extends SingletonUtils> SingletonUtils getInstance(Class<E> instanceClass) throws Exception {
if (ainsKey(instanceClass)) {
return (E) (instanceClass);
} else {
E instance = wInstance();
INSTANCES_MAP.put(instanceClass, instance);
return instance;
}
}
}
  构造⽅法建议使⽤protect修饰:
4.调⽤
  确保要单例的Java对象,继承上⾯的Java类;
5.优化
  这是⼀个接⼝请求的总⼊⼝,我们会发现通过泛型控制的单例模式,代码还是冗余,因为我使⽤的是spring,由于IOC的特性,spring 托管的bean对象都是唯⼀的,所以,我们完全可以通过注解来简化代码。
  这样,我们就可以直接使⽤该对象啦  这⾥需要注意的有两点: 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。