一、工厂模式(对象创建型模式)
1、简单工厂模式:通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
2、工厂方法模式:Factory依赖它的子类来定义工厂方法createProduct(),工厂方法返回恰当的产品对象即可。
3、抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,每个工厂只能创建一类产品。
抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类
二、单例模式(对象创建型模式)
1、饿汉式 (定义时实例化,static块内实例化)
2、懒汉式(synchronized,DoubleCheck-volatile,innerClass-jvm内部类特性)
内部类:能被反射攻击,通过【构造函数,判断对象是否已经存在】解决。序列化 都可能破坏单例,通过【写readResolve】,解决
3、注册式(枚举式,容器式-ConcurrentHashMap, ThreadLocal)
枚举式:不怕序列化,反序列化,能保证单例。
容器式:spring IOC 使用容器式。
ThreadLocal:伪单例。同一线程内保持单例。例子:使用ThreadLocal实现动态多数据源动态切换。
三、原型模式(对象创建型模式)
原型模式是指 原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
1、简单克隆
2、深度克隆
四、代理模式(结构型设计模式)
目的:一保护目标对象,二增强目标对象。为其他对象提供一种代理,以控制对这个对象的访问。使代理对象与真实被调用对象分离。代理对象在客户端和目标对象之间起到中介作用。
1、静态代理
在使用静态代理时,被代理对象与代理对象需要一起实现相同的接口或者是继承相同父类,因此要定义一个接口或抽象类.
优点:可以做到在不修改目标对象的功能前提下,对目标功能扩展.
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多。同时,一旦接口增加方法,目标对象与代理对象都要维护。
2、动态代理
能够在程序运行时JVM才为被代理对象生成代理对象。
JDK实现方式:实现接口的方式,必须有接口。生成代理简单,通过反射调用。
CGLIB实现方式:继承类的方式,任何普通类都可。生成复杂,FastClass,调用效率高。不能代理final的方法。
字节码重组。
五、委派模式(行为模式)
委派模式:负责任务的调用和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果。
Delegage结尾的类一般是委派模式;类名中包含Dispatch的一般也是委派模式。Spring中的DispacherServlet就是委派模式。
六、策略模式
Strategy pattern 分别封装算法,可以相互替换。避免ifelse或switch。
场景:选择一种算法,或者类的行为不同的相似类。
JDK中Comparator就是经典策略模式。
Spring中的Resource,InstantitionStrategy也是。
七、模板模式(行为模式)
Template Method Pattern适用场景:
1、流程化执行,
2、各子类中公共的行为被提取出来并集中到一个公共的父类中。
例子:HttpServlet,mybatis中的BaseExecutor
八、适配器模式(结构型设计模式)- 包装模式
一个类的接口转换成客户期望的另一个接口,使原本的接口不兼容的类可以一起工作。
有点亡羊补牢的感觉。例如电源插转换头、手机充电转换头、显示器转接头。
Class<? extends LoginAdapter> clazz
九、装饰者模式(结构型设计模式)- 包装模式
decorator 用来给一个类,增加或动态增加功能/职责。
可以用来代替继承,更有弹性。
例子:IO类
十、观察者模式(行为型设计模式)发布订阅模式
1、JDK observer/oberverable
2、google的guava。轻松实现观察者模式的解决方案。
通过注解的方式,@Subscribe和EventBus
spring中的contextLoadListner
十一、设计模式对比
- 策略模式&工厂模式:
- 策略模式属于行为模式,工厂模式属于创建模式。
- 工厂模式主要是创建,策略模式是接受工厂创建对象,实现不同行为。
- 策略模式&委派模式
- 策略模式是委派模式内部的一种实现形式,策略模式关注的结果是否能相互替代。
- 委派模式更关注分发和调度的过程
- 模板方法模式&工厂方法模式
- 工厂方法是模板方法的一种特殊实现。
- 对于工厂方法模式的create()方法而言,相当于只有一个步骤的模板方法模式。
- 模板方法模式&策略模式
- 模板方法和策略模式都有封装算法。
- 策略模式是使不同算法可以相互替换,且不影响客户端应用层的使用。
- 模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现。
- 模板方法模式不能改变算法流程,策略模式可以改变算法流程且可替换。策略模式通常用来代替if...else...等条件分支语句。
- 装饰者模式&静态代理模式
- 装饰者模式关注点在于给对象动态添加方法,而代理更加注重控制对对象的访问。
- 代理模式通常会在代理类中创建被代理对象的实例,而装饰者模式通常把被装饰者作为构造参数。
- 装饰者模式&适配器模式
- 装饰者模式和适配器模式都是属于包装器模式(Wrapper Pattern)。
- 装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配器和被适配者可以实现不同的接口。
- 适配器为了兼容(),装饰器为了扩展功能(is-A)。
- 适配器模式和静态代理模式
- 适配器可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式。
- 适配器模式和策略模式
- 在适配业务复杂的情况下,利用策略模式优化动态适配逻辑。