设计模式复习
单例模式
- 静态私有的实例
- 私有构造函数
- 公开访问方法
懒汉式加载方式:
在调用getinstance判断为null进行第一次初始化,通过加锁实现多线程安全(双重检验锁机制,两次判断Null,加类锁,上volatile修饰对象防止指令重排)
饿汉式加载方式:
不需要加锁即可线程安全,但类加载时就初始化,浪费内存(基于ClassLoader机制)
工厂模式
简单工厂模式:
专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
工厂模式:
简单工程模式在加入一个新产品,需要重写工厂类,不符合开闭原则
使用具体工厂创建具体产品,定义工厂父类。定义工厂和产品都需要抽象层
抽象工厂模式:
产品族中的多个对象被设计成一起工作,工厂可以创建一个产品族的所有对象,比如海尔工厂可以创建所有海尔产品
适配器模式
解决不兼容的接口问题,适配器依赖已有的对象,实现想要的目标接口
关键:适配器使用目标接口,现有对象使用适配器。
组合模式
依据树形结构来组合对象,用来表示部分以及整体层次。组合模式使用户对单个对象和组合对象的使用具有一致性。
关键:树枝内部组合该接口,并且含有内部属性 List< Component>与add,remove方法操作
外观模式
在客户端和复杂系统之间再加一层,降低访问复杂系统的复杂性,只需要访问这个接口而不需要知道子系统的内部细节。如java的mvc三层开发模式
关键:在外观类上定义好依赖关系和调用顺序
代理模式
使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,对原有对象加以控制。
静态代理:
- 定义一个接口及其实现类(真实对象);
- 创建一个代理类同样实现这个接口
- 将目标对象注入进代理类(代理类依赖真实对象),然后在代理类的对应方法调用目标类中的对应方法。
AOP动态代理(JDK 动态代理、CGLIB 动态代理):
JDK 动态代理只能代理实现了接口的类,而 CGLIB 通过生成一个被代理类的子类
- 定义一个接口及其实现类;
- 自定义
InvocationHandler
并重写invoke
方法,在invoke
方法中我们会调用原生方法(被代理类的方法)并自定义一些处理逻辑; - 通过
Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
方法创建代理对象;
- 自定义
MethodInterceptor
并重写intercept
方法,intercept
用于拦截增强被代理类的方法,和 JDK 动态代理中的invoke
方法类似; - 绑定目标对象enhancher.setSuperclass(目标类对象);enhancer.setCallback(new MethodInterceptor(new 目标对象));
- 通过
Enhancer
类的create()
创建代理
1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
装饰器模式
向一个现有的对象添加新的功能,同时又不改变其结构,比生成子类更加灵活。
ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
抽象装饰类的构造方法对component类初始化,增加其功能。
关键:1、Component 类充当抽象角色,不应该具体实现。
2、抽象修饰类引用和继承 Component 类,具体修饰类重写父类方法。
观察者模式
定义对象间的一对多的依赖关系,使得每当一个对象状态发生改变,其相关依赖对象都会得到通知并更新。
关键:在抽象subject类中有一个list存放观察者,更新时调用notify()通知所有观察者
策略模式
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。
关键:算法实现了同一个接口,从而方便调用
模板(template)方法模式
基于继承的代码复用技术,在抽象类中定义一个算法的骨架,将一些步骤通过抽象方法的声明,延迟到子类中。
上图的模板方法定义了算法的执行框架,不同的子类实现抽象方法即可快速拓展。
反思(抽象类的必要性):
接口的所有方法都是抽象方法,是抽象类的一个特例,不同有普通成员方法和成员变量,无法定义模板。
命令模式
关键:调用者——命令——接收者,调用者依赖一组命令,命令调用接受者的方法
将请求封装为对象,将行为的调用者和接受者解耦
迭代器模式
提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示
关键:迭代类实现hasnext和next方法访问数据,容器可以获得自己的iterator
Spring 框架中用到了哪些设计模式?
- 工厂设计模式 : Spring使用工厂模式通过
BeanFactory
、ApplicationContext
创建 bean 对象。 - 代理设计模式 : Spring AOP 功能的实现。
- 单例设计模式 : Spring 中的 Bean 默认都是单例的。
- 模板方法模式 : Spring 中
jdbcTemplate
、hibernateTemplate
等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。 - 装饰器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
- 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配
Controller
。
参考自https://www.runoob.com/design-pattern/filter-pattern.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧