创建型
- 工厂
作用:解耦代码
代码的解耦 一个对象我要实现单例 简单的是在这个类 中把构造方法 设置为private 然后在这个类里面 添加一个属性和方法 来返回本类的唯一实例 这就需要在类本身做修改 如果类不能修改 实现单例多例 在加一层工厂类 实例化类的时候 调用不同的工厂类 来创造 单例工厂
多例工厂 实现了创建类和类本身的解耦.
简单工厂: 又叫做静态工厂方法(StaticFactory Method)模式 由一个类充当 调用其静态方法 实现对象的创建.
spring中
beanFactory 简单工厂
继承 FactoryBean 是工厂 根据具体是实现类 来初始化类实例
-
抽象工厂
作用:解耦代码
是围绕一个超级工厂创建其他工厂 工厂上又添加了一层抽象 好比装备 武器 每个等级 对应不同的 装备 武器 装备是个工厂 武器是一个工厂 之上还有个超级工厂 来批量的控制这些工厂 -
单例
-
建造者
作用:简化代码 builder().a("a").build()
jdk中 StringBuilder
一般定义 bean的时候 可以用 lombok来简化代码 setter getter builder data -
原型
作用:简化复制类 如果类比较大 复制每个属性都要set那是很繁琐的
一般我们要完成 类的拷贝
首先类 要实现 cloneable 接口 重写clone方法 return super.clone();
在 A a = new A();
b = a.clone();
此时b是新创建的一个新的对象 其基本类型 和a保持一致 但引用的对象 是一样的
这就是 浅拷贝
实现深拷贝 一般两种方法
1 序列化 反序列化
2 重写clone方法 比方说 a类中有 aa子类 aa子类也实现 cloneable 接口 重写clone方法
重写a clone方法 this.aa = this.aa.clone();
结构型
带翔 室外 桥组装
-
代理
作用:简化资源的占用 一个类只有一个实例
动态代理 aop 静态代理可以自己写java代码
spring中
JdkDynamicAopProxy和Cglib2AopProxy
为其他对象提供一种代理以控制对这个对象的访问。 从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。 spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。 -
享元
作用:主要用于减少创建对象的数量,以减少内存占用和提高性能。
java.lang.Integer(其它基本类型包装类(除去Float,Double)也如此,还有BigDecimal)
Integer.valueOf()方法
byte,short,int,long,boolean,char的包装型在类加载到JVM时,已经缓存了制定范围的对象引用,因为值的设定使用的是static块或者常量。
其中char的范围为:0~127;
boolean的值为true和false;
其它默认范围都是-127~128。
其中int的上限127可以调整,这需要调整JVM的参数。
同时利用了享元模式的还有String这个类,因为生存的每个字符串都是不可变的。 -
适配器
作用:兼容不同的接口
比方说电脑上 电脑只支持typec的接口
u盘的接口 显示器的接口 都不能兼容
添加一个兼容器 电脑调用兼容器的接口 由兼容器来兼容 u盘接口 和显示器接口
spring中
Spring实现这一AOP功能有很多种控制器(Controller)
一种是带@Controller注解的,
还可以写一个servlet 当做controller,
所以用适配器做适配,你看看HandlerAdapter有几个子类,每个子类都是适配某一种类型的控制器,有了HandlerAdapter,你只需要调用handle方法
HandlerAdatper根据Handler规则执行不同的Handler -
外观
作用:隐藏复杂性 对外提供简单接口
- tomcat 的RequestFacade类 ResponseFacade类
https://www.zhihu.com/question/39872707
request类实现了 sevlet的相关方法 但是也实现catalina的一些方法
requestFacade包了一层 request类 对应用层暴露了简单的sevlet标准的方法 接口隔离原则
- 桥接
作用:抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化
比方说 形状
shape 圆 方
颜色 绿色 红色
我可以在圆的类 下创建 红圆 绿圆 子类
创建的时候 我就直接 new 红圆() 就可以了 但是继承 的关系不够灵活 耦合太高
用桥接的模式 创建 一个color接口 红 绿 去实现这个类
在shape构造方法中 把颜色的实例传过来 new 圆(new red())
形状 和颜色 两个接口 独立开来 互不影响 - 组合
作用: 把类当做树级关系进行管理 比方类中 add方法 是在类中 创建一个 自己类的实例 实现层级关系 - 装饰
作用:不修改原来的代码 扩展类 中增强功能
spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。
HttpServletRequest 的实现类 是在tomcat 或者 jetty容器里
然后HttpServletRequestWrap是对功能的 装饰类 需要增强方法 继承实现即可
行为型
北侧叠则放名模 关节中装
- 备忘录
- 策略
理解对代理的区别 都是可以进行选择 不同是代理和实现类的 结构 一般是一样的
而策略 只是对一组算法实现的 封装 比较抽象
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。
IoC容器根据bean定义的内容实例化相应bean对象的时候,会根据情况决定使用反射还是使用cglib来实例化相应的对象 - 迭代
- 责任链
- 访问者
- 命令
- 模板方法
- 观察者
spring中事件驱动 一个listener 是一个接受者
继承BaseEvent 定义一个事件
调用 applicationContext.publishEvent 发布事件
定义观察者 implements ApplicationListener<事件class> 实现onApplicationEvent方法
可以定义多个 观察者 来监听事件 之后做对应的事情
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
spring中如ApplicationListener。
通过对 applicationListener的实现 可以监控 spring的事件 比方说 当所有bean初始化之后 用户处理servlet请求后等. - 解释器
- 中介
- 状态
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
参考:https://blog.csdn.net/caoxiaohong1005/article/details/79961539
网友评论