一、创建型模式
1.工厂模式
工厂模式属于创建型模式,提供了创建对象的最佳方式。工厂模式将对象的创建逻辑从客户端中抽取出来,向外暴露一个共同的接口来创建对象。工厂模式至少需要两种类:工厂类和产品类,工厂类暴露接口通过参数条件返回对应创建的对象,产品类指客户端需要的对象。
1.1 简单工厂
又称为静态工厂方法模式,由一个工厂类来负责创建产品类的实例,创建逻辑都集中在简单工厂类。
1.2 工厂方法模式
由简单工厂衍生出来,针对每一种产品提供一个工厂类,通过不同的工厂实例创建不同的产品实例。
1.3 抽象工厂模式
将众多产品类按照产品族分类,每个产品族用一个抽象产品类或者接口表示。
2.单例模式
单例模式保证了在系统内部只存在一个实例,且该实例须由自己创建,并提供一个全局访问点。为保证对象不被外部创建,需存在一个私有的构造函数,实例的创建主要有饿汉和懒汉两种方式,区别在于是否有延迟初始化,对于线程安全问题可以用双重检查锁和静态内部类解决,还有一种特别的方式是用枚举实现,代码少,自由序列化。
3.建造者模式
建造者模式将一个复杂对象的构建和表示分离,用于生成复杂的对象,该复杂对象通常有多个子属性和子对象,子属性或子对象之间相互依赖,构成组合关系,建造者类负责创建对象并填充子属性,并对外提供接口。
4.原型模式
原型模式负责创建重复的对象,用原型实例指定对象的种类,并利用原型克隆新的对象。简化了创建新对象的过程。
二、结构型模式
5.适配器模式
适配器模式将某个类的接口转换为另一个客户端期望的接口,消除不同接口之间的不兼容。适配者类通过中间类适配器类实现到目标类的转换。
6.桥接模式
桥接模式将抽象部分和实现部分分离,使两者自由变化。比如颜色和图形是两个抽象维度,据此可以创建两个抽象接口:图形和颜色,用具体的实现类去实现接口,三角形类、圆形类、正方形类实现图形抽象接口,红色、绿色、蓝色实现颜色接口,通过组合关系便可以创建一个绿色正方形的类对象。
7.组合模式
组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。通过对象内包含对象来形成树形结构的层次关系,子对象也可能包含子对象,该模式思想在于将子对象抽象为树中的节点。
8.装饰器模式
装饰器模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
9.外观模式
外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。外观模式是为了解决类与类之家的依赖关系的,外观模式将类与类之间的关系置于外观类当中,对外部的客户端隐藏。
10.享元模式
享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。通常用工厂模式实现类对象的共享,如jdbc连接池。
11.代理模式
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。使用率非常高的模式,通过代理对象对目标对象进行代理,外部客户端不与目标对象接触,只通过代理对象来实现对目标对象的控制。
三、行为型模式
12.责任链模式
该模式创建了一个接受者对象的链通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
13.命令模式
请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
14.解释器模式
这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
15.迭代器模式
JAVA 中的 iterator,对集合对象提供一种遍历方式的抽象,不需要知道对象的内部实现。
16.中介者模式
通过一个中介类来实现多个类对象之间的通信,封装了不同类的对象交互,实现了解耦。
17.备忘录模式
保存对象的某个状态,并能在某个时刻恢复对象。通过备忘录类来控制记录所要保存的记录,并在某一个时刻恢复该状态。
18.观察者模式
多个对象对一个对象的行为进行订阅,当该对象发生修改的时候,通知所有的订阅类。
19.状态模式
允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
20.策略模式
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。我们预先设计了不同的策略,通过行为来选择执行的策略。
21.模版模式
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。模板方法模式就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
22.访问者模式
需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。