项目总结笔记设计模式

本文详细介绍了Java中的四种设计模式:单例模式(包括懒汉式和饿汉式)、模板方法、工厂模式(简单工厂、工厂方法和抽象工厂)以及代理模式。在单例模式中,探讨了线程安全问题和实现策略。模板方法模式以Spring中的bean生命周期为例进行说明。工厂模式阐述了各类型的区别和优缺点。最后,代理模式的实现方式和应用场景,如Spring AOP的动态代理和织入机制。
摘要由CSDN通过智能技术生成

1、 单例模式

1.1、 懒汉式
  1. 懒汉式:使用懒加载的方式创建,可以通过类名.方法名调用方法进行创建,但是这种直接创建在多线程并发操作,会有线程安全的问题,所以要通过DCL双重检验锁和volatile防止指令重排序来保证线程安全
1. 懒汉式:使用懒加载的方式创建,可以直接通过类名.方法名调用方法进行创建
    public class SafeSinglton {
    //volatile防止指令重排序,解决线程安全的问题
    private static volatile SafeSinglton safeSinglton;
    //构造方法私有,说明不能直接被实例化,但是那使用只能通过静态方法的方式
    private SafeSinglton(){}
    public static SafeSinglton getInstance(){
        //多线程并发操作下,是不安全的,所以要synchronized锁,但是每次都要进行锁的判断
        //所以通过DCL双重检验锁
        if(safeSinglton==null){
            synchronized(safeSinglton.getClass()){
                if(safeSinglton==null){
                    safeSinglton=new SafeSinglton();
                    return safeSinglton;
                }
            }
        }
        return safeSinglton;
    }
}
1.2、饿汉式
  1. 饿汉式:饿汉式的实例化对象,在类被加载到内存的时候被创建了,由JVM保证多线程初始化下的线程安全,JVM只允许一个线程拿到类构造器方法进行加锁,同步,初始化,其余线程被阻塞等待
2. 饿汉式:直接被创建
    public class ehanSingle {
    //在类被加载到你内存的时候就已经被初始化了,由JVM保证多线程安全
    //那是怎么保证安全的?
    //如果多个线程去初始化一个类,JVM保证只有一个线程可以执行类构造器,去加锁,同步等
    //其他的新城被阻塞等待
    private static ehanSingle ehanSingle=new ehanSingle();
    private ehanSingle(){};
    public static ehanSingle getInstance(){
        return ehanSingle;
    }
}

2、模板方法

  1. 把一些通用的流程步骤定义到抽象类中,公共的方法留给父类实现,吧有差异化的方法交给子类实现(在模板方法中还维护了一个钩子方法,用来做逻辑判断的)
  2. spring中的bean的创建,销毁生命周期就定义在abstractApplicationContext这个类的refresh方法中。这个方法就是模板方法,里面在初始化bean也就是beanpostprocessor方法中,是由其他web实现类定义的,像webxmlapplicationcontext
  3. reentranlock里使用自定义静态内部类的方式继承了AQS,AQS里就用到了模板方法,继承的子类必须重写方法
1. isHeldExclusive是否是独占模式
2. tryAcquired在独占模式下,尝试获取资源
3. tryRelease在独占模式下,尝试释放资源
4. tryAcquiredShared在共享模式下,尝试获取资源
5. tryReleaseShared在共享模式下,尝试释放资源

3、工厂模式

  1. 工厂模式分为:简单工厂模式,工厂方法模式,抽象工厂模式
3.1、简单工厂模式
  1. 可以根据传入的参数拿到不同的产品实例
  2. 简单工厂的组成:
    1.抽象产品类
    2.继承抽象类的具体产品类
    3.工厂:根据传入的参数生成不同的产品实例(new/反射)
  3. 缺点是:要新增产品实例,需要修改代码;违反了开闭原则,无法做到灵活扩展
3.2、工厂方法模式
  1. 和简单工厂不同的是:并不是直接把要创建的参数实例传递给工厂,而是把工厂类搞成一个抽象的工厂类
    ,里面只定义逻辑,不具体实现
  2. 真正的实现交给继承了抽象工厂类的具体工厂类
  3. 工厂方法模式的组成
    1.抽象产品类
    2.继承了抽象类的具体产品类
    3.抽象工厂类
    4.具体工厂类
  4. 好处:相较于简单工厂来说:当要新增产品实例时,可以直接新建具体工厂类;更加符合开闭原则,更加灵活,扩展性好(开闭原则:对修改关闭,对新增开放)
3.3、抽象工厂模式
  1. 工厂方法模式只能创建某一类型的实例,但是抽象工厂模式可以创建多种类型的实例
  2. 抽象工厂模式的组成:
    1.和工厂方法模式一模一样
  3. 缺点:要新增一类实例的时候,要修改原始的代码,不符合开闭原则

4、代理模式

  1. 代理模式最为一种设计思想,他的实现有两种方式:AspectJ和SpringAop
  2. AspectJ在编译器做功能增强,有专门的编译器,编译成符合JVM规范的class文件
  3. SpringAop在运行期做功能增强,只不过连接点必须是方法类型的
  4. 代理模式:就是将功能业务代码和公共代码分开来,让代码的分层更加清晰,将公共代码以横切的方式增强入业务代码中,spring中的声明式事务,日志和统一异常都可以用代理模式AOP实现
  5. 代理对象时,需要有切面,连接点,切点,通知等
    1.AspectJ切面作为注解作用在类上,表明当前配置类是增强类,也就是要增强的功能的集合
    2.切点,作用在方法上,要对那些类上的那些方法做增强
    3.连接点:是切点的集合
    4.增强:要实现的公共的逻辑
    5.织入:将公共代码横切入连接点上
  6. SpringAOP代理的两种代理类型:JDK动态代理和Cglib代理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值