博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java常用设计模式
阅读量:5879 次
发布时间:2019-06-19

本文共 2989 字,大约阅读时间需要 9 分钟。

hot3.png

设计模式:面向接口和抽象类编程,依赖接口或抽象类而不依赖具体实现

一、创建型

1、工厂方法(Factory Method

a、普通工厂:根据不同参数返回创建的不同对象。

b、工厂方法:根据不同方法返回创建的不同对象。
c、静态工厂:将方法改为static类型。

场景:Spring容器

Spring容器是最大的工厂,不仅提供了创建bean的功能,还管理bean的生命周期和bean之间的依赖关系。

ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");  Person p = (Person)ctx.getBean("chinese");  

2、抽象工厂(Abstract Factory)

对不同工厂的一个抽象,先创建工厂再创建对象。

3、单例(Singleton)

1、懒汉式:在使用时进行初始化。

2、饿汉式:类加载时就初始化。

最常用:双检锁/双重校验锁(DCL,即 double-checked locking)

public class Singleton {      private volatile static Singleton singleton;      private Singleton (){}      public static Singleton getSingleton() {      if (singleton == null) {          synchronized (Singleton.class) {             if (singleton == null) {                 singleton = new Singleton();             }          }      }      return singleton;      }  }

场景:Spring中的bean默认都是单例的(id一样的只有一个实例),降低了bean创建和销毁时的开销。

二、结构型

4、适配器(Adapter):适配器模式就是把一个类的接口变换成客户端所能接受的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作。

a、类的适配器:适配器继承已有的类,实现想要的目标接口。

b、对象适配器:适配器引用已有的对象,实现想要的目标接口。
c、接口适配器:适配器作为一个抽象类实现已有接口的方法,子类继承此抽象类重写自己需要的方法即可。

场景:Java I/O中的InputStreamReader,实现了Reader接口并且持有InputStream的引用,其作用是将InputStream适配到Reader。源角色就是InputStream代表的实例对象,目标角色就是Reader类

5、装饰器模式(Decorator):一般我们为了扩展一个类经常使用继承方式实现,但随着扩展功能的增多子类会很膨胀。在不想增加很多子类的情况下可以使用装饰器模式,它相比生成子类更为灵活(装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式)。

场景:BufferedInputStream extends FilterInputStream,FilterInputStream为装饰类(实现了InputStream并持有InputStream对象的引用),BufferedInputStream为装修类的具体实现者

6、代理模式(Proxy):创建对象的代理类以实现对这个对象的访问控制。

场景:SpringAOP功能,使用Advice(通知)来增强被代理类的功能(1、JDK动态代理,2、CGLib字节码生成技术代理),生成代理类,并在代理类的方法前设置拦截器,通过执行拦截器中的内容增强了代理方法的功能,实现面向切面编程。

7、桥接模式(Bridge):把抽象化与实现化解耦,使得二者可以独立变化。

场景:1、JDBC桥DriverManager,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。

2、slf4j-log4j12.jar桥接器:是slf4jlog4j的桥接器(日志门面接口-->桥接器-->日志框架,jcl-over-slf4j.jar桥接器:其它日志框架API转调回slf4j

直接使用具体日志框架API丧失了更换日志框架的灵活性。日志门面接口提供了一套独立于具体日志框架实现的API,应用程序通过使用这些独立的API就能够实现与具体日志框架的解耦。日志门面接口本身通常并没有实际的日志输出能力,它底层还是需要去调用具体的日志框架API的,也就是实际上它需要跟具体的日志框架结合使用。由于具体日志框架比较多,而且互相也大都不兼容,日志门面接口要想实现与任意日志框架结合可能需要对应的桥接器,就好像JDBC与各种不同的数据库之间的结合需要对应的JDBC驱动一样。

三、行为型

8、策略模式(strategy):定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

场景:Spring中的策略模式使用多如牛毛,Spring的事务管理机制就是典型的策略模式,Spring事务策略是通过PlatformTransactionManager接口实现的,它是整个Spring事务的核心。它是对事务策略的一个高度抽象,不依赖于任何具体的事务策略,而对于底层的具体的事务策略它相应的有不同的实现类。而对于不同的事务策略的切换通常由Spring容器来负责管理,应用程序既无须与具体的事务API耦合,也无须与特定的实现类耦合而将应用和持久化技术,事务API彻底分离开来。

9、模板方法(Template Method):用一个抽象类定义执行它的方法的方式/模板,子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行,为防止恶意操作,一般模板方法都加上 final 关键词。

场景:

a、继承抽象类:AQS
b、作为一个参数(回调函数)传给父类。Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式吧。

 

Ref:

 

转载于:https://my.oschina.net/u/3787772/blog/2208907

你可能感兴趣的文章
pexpect 'module' object has no attribute 'spawn'
查看>>
手机自动化测试:appium源码分析之bootstrap九 1
查看>>
linux学习工作中遇到的问题及解决办法
查看>>
分享10个帮助你实现超酷特效的jQuery插件
查看>>
atm仿真脚本
查看>>
11套免费的wordpress模板主题
查看>>
Facebook 新闻(Facebook Journalism)
查看>>
解除apt-get被占用
查看>>
PHP Smarty 模板 读取配置文件变量
查看>>
springboot集成mqtt
查看>>
Java 数组 之 一维数组 删除 元素
查看>>
【学习笔记】Android控件的使用
查看>>
mac 下载软件无法将程序拖移至app 出现错误
查看>>
关于int(1)和int(10)的区别
查看>>
动态域名解析制作
查看>>
多线程消费者和制造者的金典案例!!
查看>>
Docker快速验证HTML导出PDF高效方案
查看>>
fh admin bootstrap 模版下载 框架
查看>>
Linux之rpm包管理
查看>>
前端文件路径
查看>>