不要把简单的事情搞复杂,设计模式用来解决复杂的问题的
1.创建模型:
1.1 工厂模式:原始社会–》农耕社会-》小作坊
spring中BeanFactory factoryBean
单例模式:为了提高资源重复利用
通过技术手段保证在整个系统运行阶段,只有一个实例
场景:配置文件、监控程序、IOC容器、日历
实现手段:懒汉式、饿汉式、注册登记式、反序列化处理
spring常用的是注册登记式,效率性能最高的:内部类
原型模式:复制
spring中的对象原型,主要是为了配置信息能够被重复使用,而且互不干扰
代理模式:
应用场景:中介、黄牛、经纪人
代码场景:字节码增强、动态实现非侵入式编程
完成一件事情:代理只参与某一部分的功能
技术手段:JDK Proxy 、Cglib、aspetj、asm
策略模式:将一些固定的算法统一起来
应用场景:旅游路线的选择、出行方式的选择
代码场景:支付方式的选择
特点:巧妙地避免if …else…或者switch语句
模板方法:流程固定,某个环节有差异
应用场景:JDBCTemplate、工作流
代码场景:模拟spring JDBCTemplat的简单实现
spring-orm, 单表操作不需要写一句SQL
委派模式:代理的模式特殊情况,全权代理(代理模式+策略模式)
应用场景:项目经理、Dispatcher
代码场景:Spring中的ServletDispatcher、Delegate命名结尾的都是委派模式
适配器模式:兼容、转换
应用场景:一拖三充电头、HDMI转VGA、编码和解码
代码:登录,为了兼容旧系统的登录功能,在老系统基础之上进行兼容编程
sparing Adapter结尾的
装饰器模式:委派+适配器,注重扩展、覆盖,is-a(同源同宗)
应用场景:IO流、数据源
也用代码改造一个旧的系统
在spring中的derocator结尾的、wrapper结尾的都是
观察者模式:针对于目标对象的一举一动,要得到一个反馈
应用场景:事件监听、日志监听、短信通知
代码:Listenter、monitor、observe
单利模式(饿汉式)
package singleton;
/**
-
默认使用LazyTwo的时候,会先初始化内部类
-
如果没有使用的话,内部类是不加载的
-
@author wei.zhou
*/
public class LazyTwo {
private LazyTwo(){}
//public static final LazyTwo getInstance(){
return LazyHolder.LAZY;
}
private static class LazyHolder{
private static final LazyTwo LAZY = new LazyTwo();
}
}
饿汉式:在实例使用之前,不管你用不用,我都先new出来再说,避免了线程安全问题
懒汉式:默认加载的时候不实例化,在需要用到这个实例的时候才实例化,演示加载
注册登记式:每使用一次,都往一个固定的容器中注册并且将使用过的对象进行缓存,下次去取对象的时候,就直接从缓存中取值,以保证每次获取的都是同一个对象
IOC中的单例模式,就是典型的注册登记式单例
序列化与反序列化保证单例:重写readResolve