# 1.用到过的设计模式,JDK源码,详细介绍自己的设计模式
用到过单例模式、工厂模式、策略模式。
单例模式:
它的目的是在运行的时候只有一个对象的实例,这样可以省去创建对象用的时间,而且new对象的操作减少了,也能减少GC的压力,单例模式在很多地方都有用到:比如说Spring中的Bean都是默认单例的,还有Session和Request,每一次HTTP请求都会创建一个新的Bean,并且只会在当前的Session/request中有效,这些都使用到了单例模式。
工厂模式:
bean的创建又是使用工厂模式,通过BeanFactory或者ApplicationContext来创建的,工厂模式的好处是能够轻松方便的构建对象实例,不用关心构建的这个对象的细节和复杂过程。应用场景:线程池中的线程创建工厂。
策略模式:(抽象策略+具体策略+环境选择)
策略模式体现在我参与小程序阅心AI的开发过程中,小程序的主体是以卡片的形式分别展示:文生文、文生图、证件照、人声合成等模块,而对应的每个模块儿中其实都要经历结果生成,那么定义一个AiHandlerStrategy接口,提供一个generate方法,入参为我们卡片的各种参数(JSON形式),我们每实现一个新的功能,只需要新建一个实现类去实现这个接口就可以跳转到对应的生成方法,避免重复写过多的接口去判断,避免低效的重复代码。
同时对于我们的卡片处理也会有类似的处理方法。我们CardHandlerStrategy定义卡片处理策略,涵盖cardDetailConvert、generateSubmitConvert、convertShowKeyWord、checkInputParameter(卡片详情数据转换、生成提交JSON转换、展示提示词转换、参数录入检测)四个功能,同时提供了一个抽象类去实现这个接口,让四个卡片通过继承这个抽象类完成卡片配置。
环境类:CardConvertUtils(对应四个接口,根据外部不同的卡片调用不同的卡片处理)
# 2.单例模式的不同写法
首先就是原始的饿汉式和懒汉式。但是懒汉式在多线程的情况下会出现线程安全问题,所以我们可以加synchronized关键字,让它变为线程安全的,但是同步代码块会损耗性能,所以我们更多的是使用双重判断锁这种。
class HungrySingleton{
private HungrySingleton a = new HungrySingleton();
private HungrySingleton(){
}
public static HungrySingleton getSingleton(){
return a;
}
}
2
3
4
5
6
7
8
9
class LazySingleton{
private LazySingleton a;
private LazySingleton(){
}
Public static LazySingleton getSingleton(){
if (a ==null ){
a = new LazySingleton();
}
return a;
}
}
2
3
4
5
6
7
8
9
10
11
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
**双重判断锁:**<br />首先声明一个私有静态变量instance,用于存储单例实例。同时将构造函数私有,以防外部通过new关键字创造新的实例。<br />getInstance()方法用于获取单例实例。在这个方法中,我们首先会检查instance是否为空,如果为空则进入同步代码块,在同步代码块中我们会再次检测instance是否为空,如果为空则创建并将它的值赋给instance,最后返回。<br />我们将instance声明为volatile,保证多线程下的内存可见。这样,一个修改了instance的值的时候,其他线程就可以立即看到这个值的变化。
# 3.单例设计模式
解决一个类多实例问题,让单例的类,只有一个实例对象。
写法:
懒汉式:创建对象时机:在需要用的时候才创建,时间换空间
饿汉式:创建对象时机:在类被加载的时候创建,空间换时间
懒汉式单例,是否存在线程安全问题?
懒汉式单例是线程不安全的,在多线程并发的场景,会造成单例类创建多实例的情况。解决方法:同步方法、同步代码块、双重验证锁校验,提升Sync锁的粒度,减少不必要的阻塞。