创建型模式解决创建问题,当对象或模块创建完成之后,就需要一种设计方案来简化它们之间的关系。本文主要整理自己熟悉的代理模式,桥接模式,适配器模式,装饰模式,门面模式,组合模式,享元模式整理分享。
代理模式所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。
?
场景问题:A对象需要对B对象中的method进行功能扩展,这个时候的B对象的method方法已经在系统中广泛使用,这个时候应该如何处理A和B的关系?
解决方案:这里有关前提条件就是不对B对象进行任何改变!
静态代理
针对B类创建一个代理类C,A使用C对象完成扩展。可以解决问题但是产生一个新的问题就是如果其他对象也需要对B对象中的method进行扩展,如果都采用静态代理的方式就会产生代码的冗余,从而增加维护的成本。就需要动态代理的方式来解决这一问题。在JAVA中可以使用实现统一一个接口或继承的方式编码。
动态代理
不事先为B类创建代理类,而是在运行的时候动态创建B类的代理类,然后再系统中用代理类替换掉原始类。SpringAOP的底层实现原理就是基于动态代理的方式。
源码:org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
/***CreateanAOPproxyforthegivenbean.为指定bean创建代理类。*
returntheAOPproxyforthebean*/protectedObjectcreateProxy(Class?beanClass,NullableStringbeanName,NullableObject[]specificInterceptors,TargetSourcetargetSource){//省略具体实现(有兴趣的可以自己查看)......}桥接模式桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。也可以理解为抽象和实现的解耦。
?
场景问题:如果你现在需要开发一个中间件需要兼容市面已有的主流的消息框架或持久化框架,你该怎么设计这个中间件呢?
解决方案:参考Spring-jdbc模块的应用案例,可以把整个Spring-jdbc理解为一个整体“抽象”,不同的具体实现如