标签 - 设计模式

spring 设计模式    2016-03-17 19:11:57    757    0    0

本文将会不断总结更新

工厂方法模式

Spring中提供了FactoryBean接口,用于创建各种不同的Bean。
title
开发人员也可以自己实现该接口,常用于框架集成。比如mybatis-spring-1.1.0.jar包中的SqlSessionFactoryBean就是如此。

模板方法模式

Spring针对JDBC,JMS,JPA等规范,都提供了相应的模板方法类,如JdbcTemplate,JmsTemplate, JpaTemplate
例如JdbcTemplate,它提供了很多常用的增加,删除,查询,修改方法模板。而JMSTemplate则提供了对于消息的发送,接收方法等。下面是JMSTemplate的部分方法图:
title

代理模式

Spring中AOP,事务等都大量运用了代理模式。

观察者模式

Spring中提供了一种事件监听机制,即ApplicationListener,可以实现Spring容器内的事件监听。可以参考这里
主要是以下两个接口:
发布消息
title
监听消息
title

单例模式

Spring默认的创建Bean的作用域就是单例,即每个Spring容器中只存在一个该类的实例。可以通过@Scope(“prototype”)来修改成prototype模式,prototype在设计模式中叫做原型模式,实际上,Spring中对于@Scope(“prototype”)标记的Bean的处理的确是原型模式。

原型模式

原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。
原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

Spring中,如果一个类被标记为”prototype”,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例。
但是,Spring不能对一个prototype Bean的整个生命周期负责,容器在初始化、配置、装饰或者

设计模式 java    2016-03-16 19:01:09    672    0    0

相同点

  1. 简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。
  2. 主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。

不同点

类图

简单工厂:
title
工厂方法:
title
抽象工厂:
title

应用场景

简单工厂:适合创建同一级别的不同对象。
工厂方法:为每种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品。工厂方法模式中我们把生成产品类的时间延迟,就是通过对应的工厂类来生成对应的产品类,在这里我们就可以实现“开发-封闭”原则,无论加多少产品类,我们都不用修改原来类中的代码,而是通过增加工厂类来实现。但是这还是有缺点的,如果产品类过多,我们就要生成很多的工厂类。
抽象工厂:针对产品族,比如每个汽车公司都要同时生产轿车,货车,客车,那么每一个工厂都要有对应的生产轿车,货车和客车的方法。所以,抽象工厂类中一般会有多个抽象方法。什么是产品族呢?简单的理解就是,不同牌子产的车里面会有跑车类型,家庭类型,商用类型等的车,不同牌子的车的跑车类型的车可以组成一个产品族。抽象工厂模式中我们可以定义实现不止一个接口,一个工厂也可以生成不止一个产品类,抽象工厂模式较好的实现了“开放-封闭”原则,是三个模式中较为抽象,并具一般性的模式。

业务变更的差别

下面当我们看一下,需要增加产品的时候,三种模式都需要如何操作。
简单工厂:如果是新增同一类型的产品(都是实现Product接口的),那么需要在工厂类的ifelse中新增一个判断。客户端不需要做变更
工厂方法:新增一个产品,我们就需要新增加一个工厂类。客户端也需要变更。
抽象工厂:新增一类产品,比如新增跑车,那么需要修改抽象工厂以及所有的实现类,改动很大。新增某一个产品,比如新增一款颜色的轿车,也需要单独的工厂实现类。

简单工厂 :用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

JDK中的应用

简单工厂在JDK中的应用有很多:

java.te