软件设计模式

23种软件设计模式详细总结(按三大类划分)
image
(一)创建型模式:聚焦“对象创建”,解耦对象创建与使用
核心目标:隐藏对象创建的复杂逻辑,让客户端无需关注对象的创建细节,仅专注于对象的使用。共7种模式:
1.单例模式(Singleton)核心思想:确保一个类仅有一个实例,并提供一个全局访问点。适用场景:全局配置类、日志工具类、数据库连接池等需唯一实例的场景。关键实现:私有构造方法+静态获取实例的方法;需注意线程安全(饿汉式、懒汉式+双重校验锁、静态内部类等实现方式)。
2.工厂方法模式(Factory Method)核心思想:定义一个创建对象的接口,让子类决定实例化哪个类,将对象创建延迟到子类。适用场景:产品种类较多,且后续可能扩展新产品的场景(如文档编辑器中不同格式文件的创建)。优势:新增产品时只需新增对应的工厂类,符合开放-封闭原则。
3.抽象工厂模式(Abstract Factory)核心思想:提供一个创建一系列相关或相互依赖对象的接口,无需指定它们的具体类。适用场景:需要创建“产品族”的场景(如不同操作系统下的按钮、文本框等组件组合)。区别于工厂方法:工厂方法专注于单一产品,抽象工厂专注于产品族;扩展产品族较复杂,扩展同产品族的新产品较灵活。
4.建造者模式(Builder)核心思想:将复杂对象的构建过程与表示分离,让同一构建过程可创建不同的表示。适用场景:对象属性较多且部分属性可选(如订单对象、用户信息对象的构建)。优势:简化复杂对象的创建逻辑,客户端可清晰控制对象的构建步骤。
5.原型模式(Prototype)核心思想:通过复制现有对象(原型)来创建新对象,无需重新执行复杂的创建过程。适用场景:对象创建成本高(如数据库查询后的数据对象)、需批量创建相似对象的场景。关键实现:实现克隆接口(浅克隆/深克隆,需注意引用类型属性的复制问题)。
6.简单工厂模式(Simple Factory)核心思想:由一个工厂类统一负责创建所有产品对象,根据传入的参数决定创建哪种产品。适用场景:产品种类较少、变化不频繁的简单场景(如简单的计算器运算类创建)。注意:不属于GoF23种模式,扩展性较差,新增产品需修改工厂类代码,违反开放-封闭原则。
7.多例模式(Multiton)核心思想:确保一个类仅有有限个实例,并提供全局访问点。适用场景:需要限制实例数量的场景(如线程池中的核心线程、固定数量的配置节点)。本质:单例模式的扩展,通过容器管理有限个实例。
(二)结构型模式:聚焦“对象组合/结构”,优化模块间的依赖关系
核心目标:通过合理的对象组合或结构调整,实现模块间的低耦合,提升系统的灵活性和可扩展性。共8种模式:
1.适配器模式(Adapter)核心思想:将一个类的接口转换成客户端期望的另一个接口,让原本接口不兼容的类可以协同工作。适用场景:集成第三方组件(接口不匹配)、系统升级后旧接口兼容新接口的场景。分类:类适配器(通过继承实现)、对象适配器(通过组合实现,更推荐,符合合成复用原则)。
2.装饰器模式(Decorator)核心思想:动态地给一个对象添加额外的职责,不改变原对象的结构。适用场景:需要灵活扩展对象功能,且避免使用继承导致的类爆炸问题(如IO流中的BufferedInputStream、DataInputStream)。优势:可动态组合多个装饰器,实现多种功能的叠加。
3.代理模式(Proxy)核心思想:为其他对象提供一种代理,以控制对这个对象的访问。适用场景:权限控制、日志记录、缓存、远程调用(如Spring AOP中的动态代理)。分类:静态代理(编译期生成代理类)、动态代理(运行时生成代理类,如JDK动态代理、CGLIB代理)。
4.外观模式(Facade)核心思想:为子系统中的一组接口提供一个统一的高层接口,简化客户端与子系统的交互。适用场景:子系统结构复杂、客户端无需关注子系统内部细节的场景(如电商系统中的“下单”接口,封装了库存检查、支付、物流通知等子系统操作)。优势:降低客户端与子系统的耦合,简化系统使用难度。
5.桥接模式(Bridge)核心思想:将抽象部分与它的实现部分分离,使它们可以独立变化。适用场景:存在多个维度的变化(如产品类型和产品品牌、图形形状和颜色),需避免维度组合导致的类爆炸问题。关键:通过抽象类依赖实现接口,将两个维度的变化解耦。
6.组合模式(Composite)核心思想:将对象组合成树形结构,以表示“部分-整体”的层次关系,让客户端对单个对象和组合对象的使用具有一致性。适用场景:处理树形结构数据(如文件系统的目录结构、组织架构的部门层级)。关键:定义抽象组件类,让叶子节点(单个对象)和容器节点(组合对象)实现统一接口。
7.享元模式(Flyweight)核心思想:运用共享技术有效地支持大量细粒度对象的复用,减少内存占用。适用场景:存在大量相似对象的场景(如围棋棋盘上的棋子、文本编辑器中的字符)。关键:区分对象的内部状态(可共享)和外部状态(不可共享,由客户端传入)。
8.过滤器模式(Filter)核心思想:通过一系列过滤规则对对象集合进行筛选,允许客户端组合多个过滤条件。适用场景:数据筛选场景(如用户列表按年龄、性别、地区多条件筛选)。优势:过滤规则可复用、可组合,提升筛选逻辑的灵活性。
(三)行为型模式:聚焦“对象交互/行为”,规范模块间的通信逻辑
核心目标:定义对象间的交互规则,明确谁来做、做什么、如何做,提升交互逻辑的可复用性和可扩展性。共8种模式:
1.策略模式(Strategy)核心思想:定义一系列算法,将每个算法封装起来,并使它们可以相互替换。适用场景:存在多种相似算法,且需要动态切换算法的场景(如支付方式选择、排序算法切换)。优势:算法与客户端解耦,新增算法只需新增策略类,符合开放-封闭原则。
2.观察者模式(Observer)核心思想:定义对象间的一对多依赖关系,当一个对象(主题)的状态发生变化时,所有依赖它的对象(观察者)都会收到通知并自动更新。适用场景:事件通知场景(如消息订阅、UI组件更新、状态同步)。关键:主题维护观察者列表,提供注册、注销和通知接口;观察者实现更新接口。
3.迭代器模式(Iterator)核心思想:提供一种方法顺序访问一个聚合对象中的各个元素,而无需暴露该对象的内部表示。适用场景:需要遍历聚合对象(如列表、集合),且希望隐藏遍历细节的场景(如Java中的Iterator接口)。优势:客户端无需关注聚合对象的内部结构,统一遍历接口。
4.模板方法模式(Template Method)核心思想:定义一个操作的算法骨架,将一些步骤延迟到子类中实现,子类可重定义算法的特定步骤而不改变算法的结构。适用场景:存在多个子类共享相同算法骨架的场景(如流程化操作:数据查询-处理-输出)。关键:抽象类定义模板方法(骨架)和抽象方法(延迟到子类实现的步骤)。
5.命令模式(Command)核心思想:将一个请求封装成一个对象,使你可以用不同的请求对客户进行参数化;支持请求的排队、撤销和重做。适用场景:需要对请求进行记录、撤销/重做、异步处理的场景(如订单操作、遥控器按钮指令)。核心角色:命令接口、具体命令类、调用者、接收者。
6.状态模式(State)核心思想:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。适用场景:对象状态较多,且不同状态下行为不同的场景(如订单状态流转:待支付-待发货-待收货-已完成)。优势:状态转换逻辑集中管理,避免使用大量if-else判断,新增状态只需新增状态类。
7.责任链模式(Chain of Responsibility)核心思想:为请求创建一个接收者对象的链,让请求沿着链传递,直到有一个接收者处理它。适用场景:需要多个对象依次处理请求,且不确定具体处理者的场景(如权限校验链、异常处理链)。优势:请求发送者与接收者解耦,可动态调整责任链的顺序和节点。
解释器模式(Interpreter)核心思想:给定一个语言,定义它的文法表示,并定义一个解释器,使用该解释器来解释语言中的句子。适用场景:需要解析自定义规则或语法的场景(如表达式解析、配置文件语法解析)。注意:语法复杂时会导致类数量激增,维护难度大,仅适用于简单语法场景。

posted @ 2026-01-09 13:37  YOLO霖  阅读(40)  评论(0)    收藏  举报