------------------- 23种设计模式分类 ----------------------
- 创建型模式 (共5种):工厂方法模式 抽象工厂模式 建造者模式 单例模式 原型模式
- 结构型模式 (共7种):适配器模式 桥接模式 ;装饰器模式 代理模式 ; 组合模式 外观模式 享元模式
- 行为型模式 (共11种):策略模式 模板方法模式 责任链模式 观察者模式 迭代子模式 命令模式 状态模式 备忘录模式 访问者模式 中介者模式 解释器模式
------------------- 创建型 ----------------------
-
简单工厂模式(静态工厂模式) :用一个专业类(工厂类)来负责一种产品的对象创建。它不属于23种设计模式之一,但它是工厂模式的基础。(多工厂模式)
-
工厂方法模式:将工厂类抽象出一个接口,对象的创建方法延迟到工厂子类去实现。每一种产品都对应一个工厂子类。当新增一个产品类型时,新加对应的工厂子类即可,不再需要修改既有类。
-
抽象工厂模式:当一个类别的产品还有多个系列区分时,按系列生产商品。
-
建造者模式:当对象的创建比较复杂时,按步骤一块块创建,让创建过程模板化。
-
原型模式:通过拷贝原型对象来创建新的对象 (克隆)
注意:1 通过实现Cloneable 接口的原型模式在调用clone函数构造实例时并不一定比通过new 操作速度快,只有当通过new 构造函数 创建对象耗时时, clone 方式才能获得效率上的提升。
2 通过clone 拷贝对象时,不会再执行构造方法,一些在构造函数需要初始化的对象使用clone 拷贝需要注意
3 数值拷贝没有深浅拷贝之分,引用类型默认使用浅拷贝(影子拷贝),对于集合类型 一定要使用深拷贝。
开发中,也建议使用深拷贝,避免操作副本时影响原始对象。
------------------- 结构型 ----------------------
适配器模式
已知两个不兼容的对象,将它们融合在一起。适配器模式把一个类的接口变换成客户端需要的另一种接口,从而使因接口不匹配而无法在一起工作的类能够在一起工作。
使用场景:
Android:ListView Adapter
桥接模式
定义:将两个维度变化的功能组合起来,目的是两个维度独立变化。
主要维度,附属维度,再将附属维度接口注入到主要维度所在对象。
适配器模式和桥接模式异同:
都是把两个对象组合起来配合工作。桥接模式的目标是分离,适配器模式的目标是合并。
装饰器模式(包装模式)
定义:不影响主流程的前提下,某个环节动态地给一个对象增加一些额外的职责。
目的是增加功能。
是继承关系的一种替代方案,但比生成子类灵活。
代理模式
定义:一个类代表另一个类的功能。
代理类实现相同的接口,持有一个真实对象的引用。
装饰器模式和代理模式异同:
都是当前对象无法胜任主功能,转给第三方对象来完成主功能。
装饰器模式目标是增强自身(第三方是我内部),代理模式 目标是找外部。
组合模式(Composite Pattern)
定义:将一组相似的对象看作一个单一的对象处理。
目的是减少数据类型。
使用场景:含有多个类似树形结构
外观模式
定义: 糅合功能,对外只提供一个入口。
使用场景:当访问流程比较复杂时,将流程封闭成一个接口,供外部使用。(流程型接口,一条龙服务)
享元模式
使用共享对象有效减少内存使用量。 (Map,pools)
------------------- 行为型 ----------------------
策略模式
IOC
定义:定义一系列的算法,并将每一个算法封装起来。通过选择策略类,执行不同的算法分支。核心是通过注入对象 改变行为。
使用场景:1 需要使用if-else或switch-case 选择具体分支,且分支之间有一个共同的行为。
2 需要封装多种同一类型的操作。
Android : 插值器;
模版方法模式
定义:在父类中设计主流程,实现各个小步骤,将不确定(共同)的步骤实现延伸到子类中去实现。
使用场景:封装流程;
Android: AsyncTask;
责任链模式
定义:当出现多个对象都可以处理同一个请求时,将这些对象连成一条链(初始化整个链),并沿着这条链逐步处理请求,完成后 获取结果。
使用场景:
Android: 事件分发 dispatchTouchEvent;
观察者模式
定义:定义对象间一种 一对多的依赖关系,当这个对象状态改变时 所有依赖它的对象都会得到通知。
使用场景:1 跨系统的消息交互,如消息队列,事件总线, 广播
Android: Adapter notifyDataSetChanged
命令模式
访问者模式
定义:利用双重分派机制,弥补java多态中的方法重载是静态化的不足(声明是什么类型,识别的就是什么类型,而不管真正的类型)。
使用场景:集合中有不同类型的对象,通过方法重载(形参),无法识别它们的具体类型