本文章基于 极客时间 《设计模式之美》进行整理记录, 仅用于个人学习/交流使用
发布时间:2020年1月26日
作者:耿鬼不会笑
此部分内容参考:C语言中文网《GoF 的 23 种设计模式的分类和功能》
单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。
外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。
组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
模板方法(TemplateMethod)模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。
观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。
创建型模式主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。
单例模式:用来创建全局唯一的对象。
工厂模式:用来创建不同但是相关类型的对象(继 承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
建造者模式:用来创建复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象。
原型模式:针对创建成本比较大的对象,利用对已有对象进行复制的方式进行创建,以达到节省创建时间的目的。
中文名称 | 英文名称 | 联想记忆 | 开源实战 |
---|---|---|---|
单例模式 | Singleton | JDK中的Runtime类 | |
工厂模式 | FactoryMethod、AbstractFactory | Spring中的BeanFactory | |
建造者模式 | Builder | 建造者像是一个工人,根据不同的图纸,“定制化” 的创建不同的 “复杂对象” | |
原型模式 | Prototype | 有一个 “原型”,克隆出一个新的对象,主要是怕创建新的对象成本较大 | 深拷贝、浅拷贝 |
结构型模式主要总结了一 些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。
代理模式:在不改变原始类 (或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。
桥接模式:接口和实现分离,组合优于继承
装饰器模式:不改变原始类和接口,对原始类增强
适配器模式:事后补救策略,不兼容的接口转为可兼容
中文名称 | 英文名称 | 联想记忆 | 开源实战 |
---|---|---|---|
代理模式 | Proxy | 做一个“代理”,不改变原始类,附加功能 | Spring中的AOP、动/静态代理 |
桥接模式 | Bridge | 用一个桥,将桥两边的东西(抽象和实现)解耦,独立变化 用一个桥,将桥两边的东西组合(组合优于继承) |
JDBC数据库连接池:MySQL和Oracle的方便切换 |
装饰器模式 | Decorator | 仅仅作为一个“装饰”,不改变原始类和接口,对原始类增强 | FileInputSteam,BufferedInputStream(in), DataInputStream(bin) |
适配器模式 | Adapter | “适配器”就是不不兼容的接口转为可兼容的接口,事后补救策略 | Slf4j 日志框架 |
门面模式:将多个接口替换为一个门面接口的调用
组合模式:将一组对象组织(Compose)成树形结构,以表示一种“部分-整体”的层次结构。组合让客户端(“客户端”也代指代码的使用者)可以统一单个对象和组合对象的处理逻辑。
享元模式:所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提 是享元对象是不可变对象。
中文名称 | 英文名称 | 联想记忆 | 开源实战 |
---|---|---|---|
门面模式 | Facade | 像是家里的“门”,大门进去里面还有多个小门 一个门就是一个接口,将多个接口调用替换为一个门面接口调用 |
|
组合模式 | Composite | 并不是“多用组合”,而是将一组对象组织成树形结构 | 公司的组织结构 |
享元模式 | Flyweight | “享元”就是“被共享的单元”,复用不可变对象,节省内存 | JDK中Integer 缓冲池,JDK中的String字符串常量池 |
观察者模式:发布订阅模式,在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。
模板方法模式:让子类在不改变业务逻辑整体结构的情况下,重新定义其中的某些步骤
策略模式:解耦策略的定义、创建和使用,控制代码的复杂度
职责链模式:多个处理器依次处理同一个请求
迭代器模式:遍历集合对象
状态模式:将事件触发的状态转移和动作执行,拆分到不同的状态类中,来避免分支判断逻辑
中文名称 | 英文名称 | 联想记忆 | 开源实战 |
---|---|---|---|
观察者模式 | Observer | 消息订阅模式 | 消息队列 |
模板方法模式 | TemplateMethod | 定义一个模板(算法骨架),具体实现交给子类 | 复用:InputSteam 中的 read() 方法 扩展:继承HttpServlet,重写doGet、doPost 回调:JcbcTemplate、RedisTemplate |
策略模式 | Strategy | 不同类型的算法为一种“策略”,都是为了实现同一个目的 | 排序算法 |
职责链模式 | Chain of Responsibility | 在一条链上处理器依次进行,分两种:链上进行完,或在某处中断 | Servlet Filter、Spring Interceptor(拦截器) |
迭代器模式 | Iterator | 遍历集合对象 | JDK中的 Iterator 类 |
状态模式 | State | 表示不同状态,由事件触发 | 状态机 |
访问者模式:允许一个或者多个操作应用到一组对象上,设计意图是解耦操作和对象本身,保持类职责单一、满足开闭原则以及应对代码的复杂性。
备忘录模式:在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。
命令模式:将函数封装成对象,把函数像对象一样使用
解释器模式:为某个语言定义它的语法表示,并定义一个解释器用来处理这个语法
中介模式:一组对象之间的交互关系从多对多(网状关系)转换为一对多(星状关系)
中文名称 | 英文名称 | 联想记忆 | 开源实战 |
---|---|---|---|
访问者模式 | Visitor | 不同的“访问者”(即对象,PDFFile、WordFile、ExcelFile)到不同的人家里 (即应用场景)做不同的事情(抽取文本、压缩等),解耦操作和对象本身 |
|
备忘录模式 | Memento | 不违背封装原则的前提下,进行对象的备份和恢复 | 全量备份、增量备份 |
命令模式 | Command | 带着 "命令"到处跑(将命令封装成对象,当做变量传递来传递去,类似:C语言中的指针) | |
解释器模式 | Interpreter | 用一个解释器来解释自定义的“语法规则” | 编译器、正则表达式、Java中的注解解释器 |
中介模式 | Mediator | 作为一个中介,将客户之间复杂的”网状关系“变为“星状关系” | 航空管制 |