按照类别来分:
创建型模式
共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式
共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式
共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
关系图
从目的和范围可以二维划分:
按照这两个方面来看:
目的
创建型
创建型将类的创建延迟到SubClass,创建型将对象延迟到另一个对象中创建
结构型
结构型对于类中使用继承机制来组合,对于对象使用对象的组装来完成
行为型
行为型对于类使用继承描述算法和控制流,对于对象则描述了一组对象如何协作来完成单个对象不能完成的任务
但是模式的使用和模式之间的关系不是一成不变的,设计模式只是总结出来的一组方法,不是公式。
范围
范围指这个模式的面向的对象是谁,有类和对象二者。类模式其实处理的就是ParentClass和SunClass的关系,这些关系依赖于继承,是静态的在编译期就确定了。而对象指的是对象之间的关系,这个关系是动态的。虽然从某种意义上来说所有的模式都使用了继承机制,但是大部分的模式都属于对象的范畴。因为这个动态的使用更符合设计模式的本意和目的,具有更普适的特点。
使用的难点
分解
面向对象设计最难的在于怎么将系统分解成为对象,因为对象之间要考虑的因素很多:依赖关系、灵活性、性能、封装、粗粒度、复用等等
抽象
其次在于怎么去抽象一个对象,设计的对象源自于真实的世界,但最终设计结果和真实世界是“不一致的”。因为在设计完成后的类是异于真实世界:一个类可能有数组或Map这些真实世界不存在的,也有可能层次更为复杂,例如Composite模式
粒度
对象的粒度。我们把一个对象分解为多少个子对象或者一个对象都由多少个多大的子对象构成都是需要仔细分析的
接口
对象的接口。多态和动态绑定依赖的就是接口,所以接口是面向对象中十分核心的设计点。
描述对象关系的几种方式
实例化
用虚线来表示类的实例化,箭头指向被实例化的对象
继承
子类继承父类,箭头指向父类,其中如果是抽象类则用斜体表示,伪代码用折角框表示
继承和接口的区别:
类的继承是根据一个对象去定义另一个对象,本质是代码的共享机制。而接口继承表示的是一个对象什么时候能被另一个对象取代或替代
委托
通常表现为成员变量的形式,将请求传给被委托者来处理。图形表示中,箭头指的是
聚合
表示了包含的关系,一个对象是另一个对象的一部分,二者生命周期是相同的。在图的表示中,菱形方便 表示了包含的关系,一个对象是另一个对象的一部分,二者生命周期是相同的。在图的表示中,菱形方便
各种模式支持的场景
通过显示的指定一个类来创建对象
在创建对象时指定类名会约束扩展,应该间接创建。Abstract Factory, Factory Method, Prototype
对特殊操作依赖
对于某个请求的特殊操作,要可以在编译或运行时刻方便的变更响应请求。Chain of ResposiBility, Command
对于硬件和软件平台的依赖
减少对于平台API或者环境的依赖。Abstract Factory, Bridge