容易混淆的模式对比:
单例模式与工厂模式
工厂类一般就是被设计为单例(ApplicationContext)
工厂模式与策略模式
工厂模式包含工厂方法和抽象工厂,属于创建型模式,而策略模式属于行为型模式
工厂模式主要目的是封装好创建逻辑,策略模式接收工厂创建好的对象,从而实现不同的行为
策略模式与委派模式
策略模式是委派模式内部的一种实现形式,策略模式关注的是结果是否能相互替代。
委派模式更加关注分发和调度的过程
模板方法模式和工厂方法模式
工厂方法是模板方法的一种特殊实现,工厂模式的实现步骤简单,其中的方法调用没有顺序要求,而模板模式的可能有多个实现的步骤,并且方法调用的顺序固定,不能改变。
模板方法模式与策略模式
1、模板模式与策略模式都有封装算法
2、策略模式是使不同算法可以相互替换,且不影响客户端应用层的使用
3、模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现
4、模板模式不能改变算法的流程,策略模式可以改变算法流程且可替换,策略模式通常用于代替if...else...等条件分支语句。
装饰者模式与静态代理类模式
都持有目标对象的引用
1、装饰者模式关注的点在于给对象动态扩展、添加方法,而代理更加注重控制对象的访问。
2、代理模式通常会代理类中创建被代理对象的实例,而装饰者模式通常把被装饰者作为构造参数。
装饰者模式与适配器模式
装饰者模式和适配器模式都是属于包装器模式
装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配器和 被适配者可以实现不同的接口
适配器模式与静态代理模式
适配器模式可以结合静态代理来实现,保存被适配对象的引用,但是不是唯一的实现方式。
设计模式 | 要点 | 举例 |
---|---|---|
工厂模式(Factory) | 只对结果负责,封装创建过程 | BeanFactory / Calender |
单例模式(Singleton) | 保证独一无二 | ApplicationContext、Calender |
原型模式(Prototype) | 复制多个独立的对象实例 | ArrayList(Cloneable)、PrototypeBean |
代理模式(Proxy) | 找人办事,增强职责 | ProxyFactoryBean、JDKDynamicAopProxy、CglibAopProxy |
委派模式(Delegate) | 一个类对象的方法功能交个另外一个类来实现(例如:controller 类中的功能实现是调用Service 中的方法来实现) | DispatcherServlet、BeanDefinitionParserDelegate |
策略模式(Strategy) | 同一种功能可以有多个实现的方式,最终使用哪种是交给用户来选择多大 | InstattiationStrategy |
模板模式(Template) | 业务流程固定 | JdbcTemplate、HttpServlet |
适配器模式(Adapter) | 兼容转换头 | HandlerAdapter |
装饰器模式(Decorator) | 包装,同宗同源 | BufferedReader、 InputStream、 OutputStream HttpHeadResponseDecorator |
观察者模式(Observe) | 被观察者有相关操作,操作完成之后通知观察者 | ContextLoaderListener |