23种设计模式:
分类 | 设计模式 |
---|---|
创建型 | 工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、 建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton) |
结构型 | 适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、 装饰器模式(Decorator)、门面模式(Facade)、享元模式(Flyweight)、 代理模式(Proxy) |
行为型 | 解释器模式(Interpreter)、模板方法模式(Template Method)、 责任链模式(Chain of Responsibility)、命令模式(Command)、 迭代器模式(Iterator)、调解者模式(Mediator)、备忘录模式(Memento)、 观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、 访问者模式(Visitor) |
设计模式 | 一句话归纳 | 举例 |
---|---|---|
工厂模式(Factory) | 只对结果负责,封装创建过程。 | BeanFactory、Calender |
单例模式(Singleton) | 保证独一无二。 | ApplicationContext、Calender |
原型模式(Prototype) | 深拷贝和浅拷贝 | ArrayList、PrototypeBean |
代理模式(Proxy) | 找人办事,增强职责。 | ProxyFactoryBean、 JdkDynamicAopProxy、CglibAopProxy |
委派模式(Delegate) | 干活算你的(普通员工),功 劳算我的(项目经理)。 | DispatcherServlet、 BeanDefinitionParserDelegate |
策略模式(Strategy) | 用户选择,结果统一。 | InstantiationStrategy |
模板模式(Template) | 流程标准化,自己实现定制。 | JdbcTemplate、HttpServlet |
适配器模式(Adapter) | 兼容转换头。 | AdvisorAdapter、HandlerAdapter |
装饰器模式(Decorator) | 包装,同宗同源。 | BufferedReader、InputStream、OutputStream、 HttpHeadResponseDecorator |
观察者模式(Observer) | 任务完成时通知。 | ContextLoaderListener |
设计模式之间的关联关系和对比
-
单例模式和工厂模式
实际业务代码中,通常会把工厂类设计为单例。
-
策略模式和工厂模式
1、工厂模式包含工厂方法模式和抽象工厂模式是创建型模式,策略模式属于行为型模 式。
2、工厂模式主要目的是封装好创建逻辑,策略模式接收工厂创建好的对象,从而实现不 同的行为。 -
策略模式和委派模式
1、策略模式是委派模式内部的一种实现形式,策略模式关注的结果是否能相互替代。
2、委派模式更关注分发和调度的过程。 -
模板方法模式和工厂方法模式
工厂方法是模板方法的一种特殊实现。对于工厂方法模式的 create()方法而言,相当于只有一个步骤的模板方法模式。这一个步 骤交给子类去实现。而模板方法呢,将 needHomework()方法和 checkHomework()方 法交给子类实现,needHomework()方法和 checkHomework()方法又属于父类的某一 个步骤且不可变更。
-
模板方法模式和策略模式
1、模板方法和策略模式都有封装算法。
2、策略模式是使不同算法可以相互替换,且不影响客户端应用层的使用。
3、模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现。
4、模板方法模式不能改变算法流程,策略模式可以改变算法流程且可替换。策略模式通 常用来代替 if…else…等条件分支语句。1、WechatPay、JDPay、AliPay 是交给用户选择且相互替代解决方案。而 JdbcTemplate 下面的子类是不能相互代替的。 2、模板方法模式案例中 的 mapRow()方法一定要在获得 ResultSet 之后方可调用,否则没有意义。 -
装饰者模式和静态代理模式
1、装饰者模式关注点在于给对象动态添加方法,而代理更加注重控制对对象的访问。
2、代理模式通常会在代理类中创建被代理对象的实例,而装饰者模式通常把被装饰者作 为构造参数。装饰者和代理者虽然都持有对方引用,但逻辑处理重心是不一样的。 -
装饰者模式和适配器模式
1、装饰者模式和适配器模式都是属于包装器模式(Wrapper Pattern)。
2、装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配 器和被适配者可以实现不同的接口。装饰者和适配器都是对 SiginService 的包装和扩展,属于装饰器模式的实现形式。但是 装饰者需要满足 OOP 的 is-a 关系,我们也讲过煎饼的例子,不管如何包装都有共同的父类。而适配器主要解决兼容问题,不一定要统一父类。 -
适配器模式和静态代理模式
适配器可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式。
适配器模式和策略模式
在适配业务复杂的情况下,利用策略模式优化动态适配逻辑。