分类 设计模式 简述 一句话归纳 目的 生活案例
创建型设计模式
(简单来说就是用来创建对象的)
工厂模式(Factory Pattern) 不同条件下创建不同实例 产品标准化,生产更高效 封装创建细节 实体工厂
单例模式(Singleton Pattern) 保证一个类仅有一个实例,并且提供一个全局访问点 世上只有一个我 保证独一无二 CEO
原型模式(Prototype Pattern) 通过拷贝原型创建新的对象 拔一根猴毛,吹出千万个 高效创建对象 克隆
建造者模式(Builder Pattern) 用来创建复杂的复合对象 高配中配和低配,想选哪配就哪配 开放个性配置步骤 选配
结构型设计模式
(关注类和对象的组合)
代理模式(Proxy Pattern) 为其他对象提供一种代理以控制对这个对象的访问 没有资源没时间,得找别人来帮忙 增强职责 媒婆
外观模式(Facade Pattern) 对外提供一个统一的接口用来访问子系统 打开一扇门,通向全世界 统一访问入口 前台
装饰器模式(Decorator Pattern) 为对象添加新功能 他大舅他二舅都是他舅 灵活扩展、同宗同源 煎饼
享元模式(Flyweight Pattern) 使用对象池来减少重复对象的创建 优化资源配置,减少重复浪费 共享资源池 全国社保联网
组合模式(Composite Pattern) 将整体与局部(树形结构)进行递归组合,让客户端能够以一种的方式对其进行处理 人在一起叫团伙,心在一起叫团队 统一整体和个体 组织架构树
适配器模式(Adapter Pattern) 将原来不兼容的两个类融合在一起 万能充电器 兼容转换 电源适配
桥接模式(Bridge Pattern) 将两个能够独立变化的部分分离开来 约定优于配置 不允许用继承
行为型设计模式
(关注对象之间的通信)
模板模式(Template Pattern) 定义一套流程模板,根据需要实现模板中的操作 流程全部标准化,需要微调请覆盖 逻辑复用 把大象装进冰箱
策略模式(Strategy Pattern) 封装不同的算法,算法之间能互相替换 条条大道通罗马,具体哪条你来定 把选择权交给用户 选择支付方式
责任链模式(Chain of Responsibility Pattern) 拦截的类都实现统一接口,每个接收者都包含对下一个接收者的引用。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 各人自扫门前雪,莫管他们瓦上霜 解耦处理逻辑 踢皮球
迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个聚合对象中的各个元素 流水线上坐一天,每个包裹扫一遍 统一对集合的访问方式 逐个检票进站
命令模式(Command Pattern) 将请求封装成命令,并记录下来,能够撤销与重做 运筹帷幄之中,决胜千里之外 解耦请求和处理 遥控器
状态模式(State Pattern) 根据不同的状态做出不同的行为 状态驱动行为,行为决定状态 绑定状态和行为 订单状态跟踪
备忘录模式(Memento Pattern) 保存对象的状态,在需要时进行恢复 失足不成千古恨,想重来时就重来 备份、后悔机制 草稿箱
中介者模式(Mediator Pattern) 将对象之间的通信关联关系封装到一个中介类中单独处理,从而使其耦合松散 联系方式我给你,怎么搞定我不管 统一管理网状资源 朋友圈
解释器模式(Interpreter Pattern) 给定一个语言,定义它的语法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子 我想说”方言“,一切解释权都归我 实现特定语法解析 摩斯密码
观察者模式(Observer Pattern) 状态发生改变时通知观察者,一对多的关系 到点就通知我 解耦观察者与被观察者 闹钟
访问者模式(Visitor Pattern) 稳定数据结构,定义新的操作行为 横看成岭侧成峰,远近高低各不同 解耦数据结构和数据操作 KPI考核
委派模式(Delegate Pattern) 允许对象组合实现与继承相同的代码重用,负责任务的调用和分配 这个需求很简单,怎么实现我不管 只对结果负责 授权委托书

创建型模式:

创建型模式注重的是对象的创建

1. 单例模式

一个类只能创建一个实例, 且提供外部访问点,分为懒汉单例跟饿汉单例
懒汉就是你得主动去调用那个创建实例的方法,它才会创建, 不过需要考虑事务问题,不然会产生脏数据,线程不安全
饿汉模式就是它的对象创建是静态方法, 在类创建的时候就会创建出来对象, 是线程安全的

2. 简单工厂模式

简单工厂模式就是把对象的创建写在工厂类中, 由工厂中的方法来替你创建对象,一次创建一个, 违反开闭原则

3. 工厂模式

就是简单工厂模式的一个拓展, 通过接口的实现来创建新的对象, 满足了开闭原则,拓展性强一点

4. 抽象工厂模式

工厂模式只能创建一个产品级的对象, 而抽象工厂允许创建一个产品族的多系列产品

5. 原型模式

原型模式就是提供创建类的对象都是通过clone原型来实现的 ,这样能节省很多创建资源, java提供了浅克隆方法,需要实现cloneable接口
克隆又分深克隆跟浅克隆
浅克隆就是克隆对象与被克隆对象的属性完全相同, 非基本属性的属性也指向了原对象属性所指向的地址
深克隆则是 非基本属性的属性地址指向了新的地址

6. 建造者模式

建造者模式是用来创建比较复杂的对象, 将一个比较复杂的对象拆分成几个相对简单的部分来分别创建,之后再进行组合

结构型模式

结构模式注重的是对象之间类之间的结构关系

1.代理模式

访问者跟被访问者中间加一个代理类, 可以隔离需求跟想要,同时代理类可以增强原有功能, 在原有方法前后增加一些其他的方法什么的
代理类跟响应类都同时实现一个接口,同时响应类聚合到代理类中,代理类能调用响应类的方法,改变被调用的方法的周围加上新方法

2.桥接模式

桥接模式体现的思想是将抽象与现实分离, 这样能减少子类的数量,拓展性更强,例如汽车分品牌,分颜色,如果依次继承下去,代码很多很复杂, 通过桥接模式将不同品牌的汽车传入颜色分类中, 调用技能调用汽车品牌,又能调用颜色,满足开闭原则跟依赖导致原则

3.适配器模式

适配器模式就是将两个不相关的接口联系在一起, 这样能节省很多开发时间,提高复用率,顾名思义 ,使某个模块适用于另一个模块
具体的实现是通过实现并集成来实现的, 实现了需要使用已有模块的需求模块, 同时继承/聚合了已经有的实现模块, 集成调用了实现模块中的方法,同时实现了需求模块的需求方法

4.享元模式

代码中的某些部分是相似的,就没必要反复写了, 将其分成可以度更细的共享部分和非共享部分,进行组织便是享元模式的目的
具体的实现就是在享元工厂缓存享元部分, 将享元部分拆分出来后,存在hashmap中,达到相同对象只保存一份的目的,非享元部分作为参数传入享元部分

5.装饰模式

装饰模式重点在于装饰身上, 在不改变原功能的前提下再新增一些功能 , 是得功能更全面更漂亮,这便是装饰功能,满足开闭原则,拓展强,耦合低
如果我们不用装饰模式的话 要改一个实现类的方法的话需要去修改其代码, 但是装饰模式不一样,它通过共同实现要修改的实现类的接口, 同时又在接口中调用那个需要修改的功能, 再加上一些自己的功能,便能达到目的
这里你可能会觉得代理模式跟装饰模式的实现很相像, 是的确实像 但是其目的是不同的, 代理侧重于自身无法完成,需要代理去帮助, 而装饰是加强自身

6.组合模式

组合模式是让叶子节点跟树枝节点对外部用户来说 ,都是同一种数据类型.树枝节点能保存叶子接节点
组合模式又分透明组合模式跟安全组合模式, 透明就是根节点,叶子节点,树枝节点都实现了特定的方法, 但是根节点跟叶子节点的方法的返回值是空的
而安全模式就是只有树枝节点才有增删功能
这个模式也是钱强调的是一种对象组合的思维, 做成树的形式组合

7.外观模式

外观模式又叫做门面模式 ,facade, 门面即你可以通过访问门面接口来进一步访问其子系统,对于客户来说,不需要他去感知怎么访问的子系统
具体的实现就是门面接口聚合一些子接口

行为型模式

行为型模式注重的是对象之间的信息传递

1.模板方法模式

规定了算法骨架, 将不变的放入骨架中, 变化的逻辑交给实现类去实现,拓展的话就是有钩子方法, 通过重写父类的方法来改变父类中对某些状态的判断

2.策略模式

策略模式顾名思义,就是针对不同的条件会有不同的策略来处理其请求,将一系列的不同的算法封装起来, 通过hashmap/xml等来空着选择对应的算法来运算

3.责任链模式

责任链模式的重点是一个链字, 将不同的处理器串成一个链, 传入需求的时候,总链头走到链尾,当然可能走完一条链都没有能被处理,避免了使用if else/ switch case等判断语句, 扩展性也相对强一点

4.状态模式

正常我们通过判断不同的状态来实现不同的行为,而状态模式是将状态及状态对应的行为封装到一起, 这样方便拓展

5.观察者模式

观察者模式是针对一对多的情况, 一个对象改变其他的对象通过接收消息的方法来做出对应的改变,这样能适当的松耦合

6.迭代器模式

迭代器模式用的比较少, 因为目前的java语言自带迭代器,需要你特意去写的情况也不多, 迭代器的内部也是一个list, 它就能将你的对象进行封装,你的对象啥样它并不在乎,它在乎的只是执行的顺序

7.备忘录模式

备忘录模式就是会将对象的内部状态进行保存,当我们需要回退状态的时候再调取保存好的状态

8.访问者模式

访问者模式就是针对访问相同的元素来说,访问者 不同,其响应也不同, 将元素的操作分离出来,再不改变其结构的前提下对元素的功能进行拓展,封装

9.命令模式

命令模式就是将请求与实现进行分割, 将一个请求封装成一个对象, 请求的变化不影响实现的对象, 这便是命令模式的用意 调用者发送特定的请求,请求实现类再通过聚合调用某个实现者, 调用者不论怎么样, 都改变不了实现者
如果不进行分割的话 比如你的请求是一个入参, 你的入参传进实现者里面, 你如果入参改变,那么直接影响到你的实现者了

10.中介者模式

中介者就是用星型关系带起网型, 通过注册跟发布,使得多对多关系变成了一对一关系

11.解释器模式

用的非常的少, 给定一个语言,定义其语法,并定义一个语言解释器,通过解释器来解释语言