设计模式一览
设计模式分类
创建型:
- factory method:工厂类接口,在工厂类实现中定义要创建的类。==典型特征:只有一个创建方法。==
- abstract factory:工厂类接口,在工厂类实现中定义要创建的一类产品族。==典型特征:有多个创建不同产品的方法。==
- builder:通过部件,组装产品。在建造者中,依次添加产品部件。==典型特征:建造类中添加组件,产品类中有个执行方法。==
- prototype:clone模式,通过克隆创建新对象。==典型特征:实现Clonable,有浅克隆、深克隆==
- singleton:单例模式,饿汉式/懒汉式(同步方法,嵌套【同步代码块+双重检测】,volatile+双重检测)。==典型特征:饿汉式较安全,懒汉式可以提高系统初始化速度,但要注意多线程安全==
结构型:
- adapter:API转换,封装具体的实现类,提供统一接口。==典型特征:有一套标准的接口API,其他实现类,需要经过适配器封装成标准API模式。==
- bridge:桥接模式,类似静态代理。==典型特征:定义功能接口。具体类delegate功能类,完成其部分功能。==
- composite:复合模式,将对象组合成树形结构,表示“整体-部分”的层次结构,使得对单个对象和复合对象的调用一致。==典型特征:树、子树、树叶,树叶屏蔽部分方法。==
- decorator:装饰器模式,动态的为具体类添加功能。==典型特征:装饰器抽象类实现目标接口类,然后装饰器具体类delegate具体对象。==
- facade:外观模式,隐藏内部实现方式,定义统一的接口,方便外部调用。==典型特征:给外部定义专用的接口,对内部具体实现类封装。==
- flyWeight:享元模式,是一个提高程序效率和性能的模式,采用共享来避免大量拥有相同内容对象的开销。==典型特征:结合工厂模式,传入key,目标对象已存在,直接返回;不存在,创建后返回。==
- proxy:代理模式,为其他对象提供一个代理类,控制访问。==典型特征:实现jdk动态代理,或者cglib动态代理接口。在方法调用前后,控制访问。==
行为型:
- observer:观察者模式,也称publish-subscribe模式。jdk自带接口类
java.util.Observable
实现发布者;java.util.Observer
实现订阅者。 - state:使得对象被划分成对象 + 状态对象两部分,一定程度上体现了Delegate的设计原则。替代if…else/switch的一种方式 。状态以类表示,包含对应状态的执行动作。每次执行后,切换状态。
- strategy:策略模式,一个行为有多种实现。根据调用者动态选择不同行为实现。
- visitor:访问者模式,由访问者,对象结构类,元素接口,元素类构成。由对象结构类组装访问者+元素,易拓展,但是零散/复杂。
- interpreter:解释器模式,给定一个语言,定义它的的文法的一种表示,并定义一个解释器。解释器使用该表示来解释语言中的句子。
- template method:模板方法模式,接口中定义骨架,具体实现延迟到子类。
- chain of responsibility:责任链模式,将请求的发送者/接收者解耦合,使多个接收对象都有机会处理请求。将这些对象连成一条链(线,树,环),沿着链传递请求,直到有一个对象处理它。
- command:命令行模式,将请求封装成一个对象,从而可以使用不同的请求命令对客户(invoker)进行参数化;对请求排队或记录日志,以及支持可取消的操作。缺点:会导致某些系统有过多的具体Command类。
- iterator:迭代器模式,提供一个方法,顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示。常见实现接口
java.util.Iterator
,提供不同实现,高效迭代聚合对象(因为底层数据结构不同)。 - mediator:中介者模式,用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。==典型特征:同事类注册给终结者。同事类调用时,由中介者协调其他注册的同事类行为。==
- memento:备忘录模式,在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存前的状态。
参考文档: