spring源码的设计模式

转:https://blog.csdn.net/huyang0304/article/details/82928900算法

接下来咱们只介绍在Spring中经常使用的设计模式。spring

1.一、简单工厂模式(Factory)数据库

应用场景:又叫作静态工厂方法(StaticFactoryMethod)模式,但不属于23种设计模式之一。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该建立哪个产品类。apache

Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个惟一的标识来得到Bean对象,可是否是在传入参数后建立仍是传入参数前建立这个要根据具体状况来定。设计模式

归类app

特色框架

穷举编码

建立型模式spa

是复杂工厂模式的思惟模型.net

批量生产、标准化

1.二、工厂方法模式(FactoryMethod)

应用场景:一般由应用程序直接使用new建立新的对象,为了将对象的建立和使用相分离,采用工厂模式,即应用程序将对象的建立及初始化职责交给工厂对象。

通常状况下,应用程序有本身的工厂对象来建立Bean.若是将应用程序本身的工厂对象交给Spring管理,那么Spring

管理的就不是普通的Bean,而是工厂Bean。

归类

特色

穷举

建立型模式

对于调用者来讲,隐藏了复杂的逻辑处理过程,调用者只关心执行结果。

对于工厂来讲要对结果负责,保证生产出符合规范的产品。

流水线生产

1.三、单例模式(Singleton)

应用场景:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是由于Spring管理的是是任意的Java对象。Spring下默认的Bean均为单例。

归类

特色

穷举

建立型模式

保证从系统启动到系统终止,全过程只会产生一个实例。

当咱们在应用中遇到功能性冲突的时候,须要使用单例模式。

配置文件、日历、OC容器

 

经常使用单例模式写法:饿汉式、懒汉式、注册式、序列化。

1.四、原型模式(Prototype)

应用场景:原型模式就是从一个对象再建立另一个可定制的对象,并且不须要知道任何建立的细节。

所谓原型模式,就是Java中的克隆技术,以某个对象为原型。复制出新的对象。显然新的对象具有原型对象的特色,效率高(避免了从新执行构造过程步骤)。

归类

特色

穷举

建立型模式

首先有一个原型。

数据内容相同,但对象实例不一样(彻底两个个体)。

孙悟空吹毫毛

1.五、代理模式(Proxy)

应用场景:为其余对象提供一种代理以控制对这个对象的访问。从结构上来看和Decorator模式相似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增长职责。

Spring的Proxy模式在AOP中有体现,好比JdkDynamicAopProxy和Cglib2AopProxy。

归类

特色

穷举

结构型模式

执行者、被代理人

对于被代理人来讲,这件事情是必定要作的,可是我本身又不想作或者没有时间作。

对于代理人而言,须要获取到被代理的人我的资料,只是参与整个过程的某个或几个环节。

租房中介、售票黄牛、婚介、经纪人、快递、事务代理、非侵入式日志监听

1.六、策略模式(Strategy)

应用场景:定义一系列的算法,把它们一个个封装起来,而且使它们可相互替换。本模式使得算法可独

立于使用它的客户而变化。

Spring中在实例化对象的时候用到Strategy模式,在SimpleInstantiationStrategy有使用。

归类

特色

穷举

行为型模式

最终执行结果是固定的。

执行过程和执行逻辑不同。

旅游出行方式

1.七、模板方法模式(TemplateMethod)

定义一个操做中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。

TemplateMethod模式通常是须要继承的。这里想要探讨另外一种对TemplateMethod的理解。Spring中的JdbcTemplate,在用这个类时并不想去继承这个类,由于这个类的方法太多,可是咱们仍是想用到JdbcTemplate

已有的稳定的、公用的数据库链接,那么咱们怎么办呢?咱们能够把变化的东西抽出来做为一个参数传入JdbcTemplate的方法中。可是变化的东西是一段代码,并且这段代码会用到JdbcTemplate中的变量。怎么办?那咱们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,咱们去实现这个方法,就把变化的东西集中到这里了。而后咱们再传入这个回调对象到JdbcTemplate,从而完成了调用。这就是TemplateMethod不须要继承的另外一种实现方式。

归类

特色

穷举

行为型模式

执行流程固定,但中间有些步骤有细微差异(运行时才肯定)。

可实现批量生产。

SpringORM数据模型

1.八、委派模式(Delegate)

应用场景:不属于23种设计模式之一,是面向对象设计模式中经常使用的一种模式。这种模式的原理为类B和类A是两个互相没有任何关系的类,B具备和A如出一辙的方法和属性;而且调用B中的方法,属性就是调用A中同名的方法和属性。B好像就是一个受A受权委托的中介。第三方的代码不须要知道A的存在,也不须要和A发生直接的联系,经过B就能够直接使用A的功能,这样既可以使用到A的各类功能,又可以很好的将A保护起来了,一箭双雕。

归类

特色

穷举

行为型模式

要和代理模式区分开来。

持有被委托人的引用。

不关心过程,只关心结果。

经理派发工做任务、Dispatcher

1.九、适配器模式(Adapter)

SpringAOP模块对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型的支持其实是借助适配器模式来实现的,这样的好处是使得框架容许用户向框架中加入本身想要支持的任何一种通知类型,上述三种通知类型是SpringAOP模块定义的,它们是AOP联盟定义的Advice的子类型。

归类

特色

穷举

结构型模式

注重兼容、转换。

适配者与被适配这之间没有层级关系,也没有必然联系。

知足has-a的关系。

编码解码、一拖三充电头、HDMI转VGA、Type-C转USB

1.十、装饰器模式(Decorator)

应用场景:在咱们的项目中遇到这样一个问题:咱们的项目须要链接多个数据库,并且不一样的客户在每

次访问中根据须要会去访问不一样的数据库。咱们以往在Spring和Hibernate框架中老是配置一个数据源,于是SessionFactory的DataSource属性老是指向这个数据源而且恒定不变,全部DAO在使用SessionFactory的时候都是经过这个数据源访问数据库。可是如今,因为项目的须要,咱们的DAO在访问SessionFactory的时候都不得不在多个数据源中不断切换,问题就出现了:如何让SessionFactory在执行数据持久化的时候,根据客户的需求可以动态切换不一样的数据源?咱们能不能在Spring的框架下经过少许修改获得解决?是否有什么设计模式能够利用呢?

首先想到在Spring的ApplicationContext中配置全部的DataSource。这些DataSource多是各类不一样类型的,好比不一样的数据库:Oracle、SQLServer、MySQL等,也多是不一样的数据源:好比Apache提供的org.apache.commons.dbcp.BasicDataSource、Spring提供的org.springframework.jndi.JndiObjectFactoryBean等。而后SessionFactory根据客户的每次请求,将DataSource属性设置成不一样的数据源,以到达切换数据源的目的。

Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另外一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。

归类

特色

穷举

结构型模式

一、注重覆盖、扩展。

二、装饰器和被装饰器都实现同一个接口,主要目的是为了扩展以后依旧保留OOP关系(同宗同源)。

三、知足is-a的关系。

IO流包装、数据源包装、简历包装

1.十一、观察者模式(Observer)

应用场景:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象

都获得通知并被自动更新。

Spring中Observer模式经常使用的地方是Listener的实现。如ApplicationListener。————————————————版权声明:本文为CSDN博主「yyyyyhu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/huyang0304/article/details/82928900

相关文章
相关标签/搜索