不要生搬硬套,根据业务场景选择。
不要把简单的事情搞复杂,设计模式用来解决复杂问题。
把复杂的问题变得简单起来(总结利用好前任经验)。
创建型:(只对结果负责,不要三无产品)
- 工厂模式
- 原始社会 --> 农耕社会 --> 小作坊 --> 工厂 --> 流水线生成
- Spring: BeanFactory FactoryBean
- 单例模式(保证独一无二)
- 为了提高资源重复利用
- 通过技术手段保证在整个系统运行阶段,只有一个实例
- 场景:配置文件、监控程序、IOC容器、日历
- 实现手段:懒汉式、饿汉式、注册登记式、反序列化处理
- Spring中最常用的,注册登记式。效率性能最高的:内部类
- 原型模式:复制(拔一根猴毛,吹出千万个)
- Spring中的对象原型,主要是为了配置信息能够被重复使用,而且互不干扰
<bean scope="prototype"> <list></list> </bean>
- 技术手段:实现cloneable重写clone方法、字节码操作来是实现、通过反射机制来实现(Spring中常用)
- Spring中的对象原型,主要是为了配置信息能够被重复使用,而且互不干扰
- 代理模式(办事要求人、所以找代理)
- 应用场景:黄牛、中介、经纪人
- 代码场景:字节码增强、动态实现非侵入式编程
- 完成一件事情:代理只参与某一部分的功能
- 技术手段:JDK Proxy,Cglib,AspectJ、asm
- 通过代码演示,自己模拟实现了JDK动态代理底层
- 策略模式(我行我素,达到目的就行。)
- 将一些固定的算法统一起来
- 应用场景:旅行路线的选择、出行方式的选择
- 代码场景:支付方式的选择
- 特点:巧妙地避免if...else... 或者switch语句
- 模板方法(流程标准化,原料自己加。)
- 流程固定:某一个环节差异
- 应用场景:JdbcTemplate、工作流
- 代码场景:模拟Spring JdbcTempate的简单实现 spring-orm,单表操作不需要写一句SQL
- 委派模式(干活是你的(普通员工),功劳算我的(项目经理))
- 代理模式的特殊情况、全权代理
- 应用场景:项目经理、Dispatcher
- 代码场景:Spring中的ServletDispatcher、Delegate命名结尾的都是委派模式
- 适配器模式 兼容、转换(需要一个转换头(兼容))
- 应用场景:一拖三充电头、HDMI转VGA、编码和解码
- 代码场景:登录,为了兼容旧系统的登录功能,在老系统基础之上进行兼容编程
- Spring:Adapter 结尾的
- 装饰器模式(需要包装,但不改变本质(同宗同源)。)
- 委派 + 适配器,注重的扩展、覆盖,is-a
- 应用场景:IO流、数据流
- 也用代码改造一个旧系统
- 在Spring中Derocator结尾的、Wrapper结尾的都是
- 观察者模式:(完成时通知我。)
- 针对于目标对象的一举一动,要得到一个反馈
- 应用场景:事件监听、日志监听、短信通知
- 代码场景:Listener、Monitor、Observer
- Spring Listener(通常会结合动态代理)
待续...