1、 单例模式
1.1、 懒汉式
- 懒汉式:使用懒加载的方式创建,可以通过类名.方法名调用方法进行创建,但是这种直接创建在多线程并发操作,会有线程安全的问题,所以要通过DCL双重检验锁和volatile防止指令重排序来保证线程安全
1. 懒汉式:使用懒加载的方式创建,可以直接通过类名.方法名调用方法进行创建
public class SafeSinglton {
private static volatile SafeSinglton safeSinglton;
private SafeSinglton(){}
public static SafeSinglton getInstance(){
if(safeSinglton==null){
synchronized(safeSinglton.getClass()){
if(safeSinglton==null){
safeSinglton=new SafeSinglton();
return safeSinglton;
}
}
}
return safeSinglton;
}
}
1.2、饿汉式
- 饿汉式:饿汉式的实例化对象,在类被加载到内存的时候被创建了,由JVM保证多线程初始化下的线程安全,JVM只允许一个线程拿到类构造器方法进行加锁,同步,初始化,其余线程被阻塞等待
2. 饿汉式:直接被创建
public class ehanSingle {
private static ehanSingle ehanSingle=new ehanSingle();
private ehanSingle(){};
public static ehanSingle getInstance(){
return ehanSingle;
}
}
2、模板方法
- 把一些通用的流程步骤定义到抽象类中,公共的方法留给父类实现,吧有差异化的方法交给子类实现(在模板方法中还维护了一个钩子方法,用来做逻辑判断的)
- spring中的bean的创建,销毁生命周期就定义在abstractApplicationContext这个类的refresh方法中。这个方法就是模板方法,里面在初始化bean也就是beanpostprocessor方法中,是由其他web实现类定义的,像webxmlapplicationcontext
- reentranlock里使用自定义静态内部类的方式继承了AQS,AQS里就用到了模板方法,继承的子类必须重写方法
1. isHeldExclusive是否是独占模式
2. tryAcquired在独占模式下,尝试获取资源
3. tryRelease在独占模式下,尝试释放资源
4. tryAcquiredShared在共享模式下,尝试获取资源
5. tryReleaseShared在共享模式下,尝试释放资源
3、工厂模式
- 工厂模式分为:简单工厂模式,工厂方法模式,抽象工厂模式
3.1、简单工厂模式
- 可以根据传入的参数拿到不同的产品实例
- 简单工厂的组成:
1.抽象产品类
2.继承抽象类的具体产品类
3.工厂:根据传入的参数生成不同的产品实例(new/反射) - 缺点是:要新增产品实例,需要修改代码;违反了开闭原则,无法做到灵活扩展
3.2、工厂方法模式
- 和简单工厂不同的是:并不是直接把要创建的参数实例传递给工厂,而是把工厂类搞成一个抽象的工厂类
,里面只定义逻辑,不具体实现 - 真正的实现交给继承了抽象工厂类的具体工厂类
- 工厂方法模式的组成
1.抽象产品类
2.继承了抽象类的具体产品类
3.抽象工厂类
4.具体工厂类 - 好处:相较于简单工厂来说:当要新增产品实例时,可以直接新建具体工厂类;更加符合开闭原则,更加灵活,扩展性好(开闭原则:对修改关闭,对新增开放)
3.3、抽象工厂模式
- 工厂方法模式只能创建某一类型的实例,但是抽象工厂模式可以创建多种类型的实例
- 抽象工厂模式的组成:
1.和工厂方法模式一模一样 - 缺点:要新增一类实例的时候,要修改原始的代码,不符合开闭原则
4、代理模式
- 代理模式最为一种设计思想,他的实现有两种方式:AspectJ和SpringAop
- AspectJ在编译器做功能增强,有专门的编译器,编译成符合JVM规范的class文件
- SpringAop在运行期做功能增强,只不过连接点必须是方法类型的
- 代理模式:就是将功能业务代码和公共代码分开来,让代码的分层更加清晰,将公共代码以横切的方式增强入业务代码中,spring中的声明式事务,日志和统一异常都可以用代理模式AOP实现
- 代理对象时,需要有切面,连接点,切点,通知等
1.AspectJ切面作为注解作用在类上,表明当前配置类是增强类,也就是要增强的功能的集合
2.切点,作用在方法上,要对那些类上的那些方法做增强
3.连接点:是切点的集合
4.增强:要实现的公共的逻辑
5.织入:将公共代码横切入连接点上 - SpringAOP代理的两种代理类型:JDK动态代理和Cglib代理