一.简单工厂
BeanFactory,我们经常会用到BeanFactory.getBean(id)获取对象,这就是简单工厂的体现。
<bean id="" class=""></bean>
特点是:工厂类可以创建多种类型的对象,根据不同的参数,可以获取到不同的对象。
二.工厂方法
2.1静态工厂方法
标签:
<bean id="" class="" factory-method="">
<constructor-arg value=""></constructor-arg>
</bean>
2.2实例工厂方法
跟静态工厂方法的区别在于,静态工厂方法不用实例化工厂类,而实例工厂方法需要。
标签:
实例化工厂类
<bean id="instaceFactory" class="springDesignMode.factoryMethod.UserInstaceFactory"></bean>
对象类:
factory-bean=“InstanceFactory” :指定使用哪个工厂实例。
factory-method=“getUser”:使用哪个工厂方法。
<bean id="user1" factory-bean="instaceFactory" factory-method="getUser">
<constructor-arg value="qwx"></constructor-arg>
</bean>
2.3 FactoryBean工厂创建Bean
必须实现FactoryBean接口,重写三个方法
适用场景:
想在代码里自定义对象的创建逻辑。
标签:
<bean id="userFactoryBean" class="springDesignMode.factoryMethod.UserFactoryBean"></bean>
三.单例模式
饿汉式、懒汉式、注册表
饿汉式:在类加载就完成对象的初始化
懒汉式:第一次访问才初始化。会用到双重检查锁
spring用的是单例注册表:1.使用map实现注册表;2.使用protect修饰构造方法
单例的源码与单例的三级缓存值得注意。
四.适配器模式
将一个类的接口转换成需求希望的另一个接口。并且能够结合两个不同的接口形成统一的接口提供出去。
为什么重写呢——提高代码的复用性。
组成:
target :目标类
adaptee:被适配的类
adapter:适配类
springAop用到适配器源码暂时还不是很懂。
五.装饰者模式
在不改变原有类的基础上,扩展原有对象的功能。
与适配器不同之处在于,装饰者注重类的继承(同宗同源),而适配器注重接口的转换。
组成:
抽象构建角色(被装饰接口)
具体构建角色(被装饰类)
抽象装饰角色(装饰接口)
具体装饰角色(装饰类)
spring装饰者模式源码还需要理解。
六.代理模式
提供一种代理以控制对这个对象的访问。
与装饰者模式的异同:
同:装饰者和被装饰者都实现一个接口;代理类和真实处理的类也都实现同一个接口。
异:装饰者模式使用的是外部传入的被装饰对象,调用者只想要你把他的对象装饰一下。而代理模式使用的是自己构造方法里面new出来的一个被代理的对象,不是调用者传入的。
装饰者注重对对象功能的扩展,代理注重控制对象的访问。
springAop应用到代理模式源码需要细读
七.观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
场景:一个事件触发了一系列事件。
小例子:我们订阅了某个公众号之后,公众号就会维护一个订阅用户列表,每当发表一篇文章,就会向这个订阅用户列表发送这篇文章。
spring事件驱动由三部分组成:
-
事件:ApplicationEvent,继承自JDK的EventObject,所有事件将继承它,并通过source得到事件源。
-
事件发布者:ApplicationEventPublisher及ApplicationEventMulticaster接口,使用这个接口,我们的service就有了发布事件的能力。
-
事件订阅者:ApplicationListener,继承自JDK的EventListener,所有监听器将继承它。
spring观察者源码还需要认真阅读。
八、策略模式
场景:实现一个功能,可以有多种不同的方式,我们可以根据不同的条件确定不同的方式去实现这个功能。例如:比如支付方式的选择,可以用银联、微信、支付宝,根据不同的入参,确定不同的支付方式,走不同的逻辑。
九、模板模式
在spring源码中的应用需要认真阅读。生疏指数高。