# design-mode **Repository Path**: carmeloLee/design-mode ## Basic Information - **Project Name**: design-mode - **Description**: "设计模式"个人学习项目 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2021-09-23 - **Last Updated**: 2025-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, 设计模式 ## README ![img.png](design-mode.png) ①、创建型模式:关注对象的创建过程 一、singleton(单例模式): 保证一个类只生成唯一的实例对象,同时提供能对该实例访问的全局访问方法 java.lang.Runtime.getRuntime() 二、Factory(工厂模式) SimpleFactory(简单工厂模式): 用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码) Calendar.getInstance() FactoryMethod(工厂方法模式): 用来生产同一等级结构中的固定产品。(支持增加任意产品) AbstractFactory(抽象工厂模式): 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族) 三、Builder(建造者模式): 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象 Google Guava: CacheBuilder#newBuilder() 四、Prototype(原型模式): 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式 ②、结构型模式:关注对象和类的组织;从程序结构上实现松耦合,从而可以扩大整体的类结构 一、Adapter(适配器模式): 使原本由于接口不兼容、不能一起工作的类可以一起工作 二、Bridge(桥接模式): 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联 桥接模式可以取代多层继承的方案。多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大地减少子类的个数,从而降低管理和维护的成本 三、Decorator(装饰模式): 动态地给对象添加额外的功能,比继承灵活 java.util.Collection和java.util.Collections.UnmodifiableCollection、java.util.Collections.CheckedCollection、java.util.Collections.SynchronizedCollection Google Guava: ForwardingCollection 四、Composite(组合模式): 将对象组合成树状结构以表示”部分和整体”层次结构,使得客户可以统一的方式调用叶子Leaf对象和容器对象;要有较高的抽象性; 五、Facade(门面模式、外观模式): 为子系统提供统一的调用接口,封装子系统的复杂性,便于客户端调用;SLF4J 六、Flyweight(享元模式): 运用共享技术高效地实现大量细粒度对象的重用,节省内存(以时间换空间);是池化技术的重要实现方式;常与工厂模式配合使用 内部状态:可共享,不会随环境变化而改变; 外部状态:不可共享,会随环境变化而改变; eg:java.lang.String.intern()、Integer缓存(-128 ~ 127)、ThreadLocal 七、Proxy(代理模式): 为真实对象提供一个Proxy代理,从而控制对真实对象的访问。 代理模式常用在业务系统中开发一些非功能性需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。 ③、行为型模式:关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责 一、Mediator(中介者模式): 将多对多模式通过中介解耦成一对多模式;将网状结构调整为星形结构;MVC(C就是中介者模式,M、V都与它交互) ![img.png](mediator.png) 二、Chain Of Responsibility(责任链模式) 优点: 将请求者和处理者解耦; 缺点: 责任链过长时的性能问题,每个请求都从链头遍历到链尾 应用场景: ①、Servlet Filter: javax.servlet.Filter、javax.servlet.FilterChain ②、Spring Interceptor: org.springframework.web.servlet.HandlerInterceptor、org.springframework.web.servlet.HandlerExecutionChain ③、MyBatis Plugin: org.apache.ibatis.plugin.Interceptor、org.apache.ibatis.plugin.InterceptorChain 三、Template Method(模板方法模式): 处理步骤父类中定义好,具体实现延迟到子类中实现;抽象类里面定义的是基本方法,抽象类里面实现的基本方法叫具体方法、在子类里面实现的叫抽象方法;标准方法可以在抽象类中的具体方法实现; 模板模式有两大作用:复用和扩展。其中复用指的是,所有的子类可以复用父类中提供的模板方法的代码。扩展指的是,框架通过模板模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能。 四、Strategy(策略模式): 可以解决一堆if...else if问题 五、Visitor(访问者模式): 以行为(某一个操作)作为扩展对象功能的出发点,在不改变已有类功能的前提下进行批量扩展; 六、Observer(观察者模式): 使用场景为"广播机制",用于1-N的通知:当一个Subject目标对象的状态变化时,需要及时告诉一系列Observer对象,通知他们及时作出响应; JDK封装:java.util.Observable、java.util.Observer ![img.png](observer.png) 七、Interpreter(解释器模式): 当有一个语言需要解释执行,可将该语言中的句子表示为一个抽象的语法树(会涉及到递归)。就可以考虑使用解释器模式,让程序具有良好的扩展性; 应用场景: 编辑器、运算表达式计算、规则引擎、正则表达式、SQL解析、机器人等 八:State(状态模式): 最常用的实现方式是状态机,大量应用于需要控制状态流转的系统中。常用在游戏、工作流引擎、购物流程等系统开发中; 九、Memento(备忘录模式): 也叫快照模式,通常用于捕获一个对象的内部状态,比如保存、打开、关闭等状态,并在执行对象之外保存一个副本状态,方便用于之后恢复对象到某一个时间状态; 十、Iterator(迭代器模式): 大量应用于基础类库中,对重复遍历操作进行封装。现在大部分编程语言都提供了现成的迭代器可以使用,我们不需要从零开始开发; 十一、Command(命令模式): 将某个命令(函数方法)封装成对象进行传递,关注的维度是命令,比如,打开、关闭文件的命令。用于处理多个命令调用和使用远程服务的场景。另外,它还会与备忘录模式结合在一起用于撤销和重做等场景