设计模式复习

 

单例模式

  • 静态私有的实例
  • 私有构造函数
  • 公开访问方法

懒汉式加载方式:

在调用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使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。
  • 代理设计模式 : Spring AOP 功能的实现。
  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  • 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  • 装饰器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  • 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller

 

参考自https://www.runoob.com/design-pattern/filter-pattern.html

posted @   黑白灰java  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示