设计模式 · 从 23 到 192 · 工程语言的演进
Design Patterns · 23 → 192

设计模式:从 23 到 192 的工程语言演进

1994 年 GoF 写下 23 个面向对象模式;2026 年 iluwatar/java-design-patterns 仓库收录了 192 个。三倍多的差距,不是堆砌,而是软件世界在 30 年里「要解决的问题」发生了根本迁移——从单线程桌面对象,走向并发、分布、微服务与云原生。本文以仓库为经(真实可查源码),以 GoF 三族为纬(经典骨架),串起模式、原则与定律之间的互文。

主线:iluwatar/java-design-patterns 站点:java-design-patterns.com/zh/patterns 对照:refactoring.guru 设计模式 模式:192 个 整理:2026-09-22

00开篇:模式的疆域

模式不是「工具箱里的工具」,而是一种被命名的共享词汇。一旦团队能用名字沟通,设计讨论就从「我给你讲一遍这段代码」降级为「这里用个装饰器就行」。

设计模式的概念并非软件独创。建筑学家 Christopher Alexander 在《建筑模式语言》中第一次提出:城市设计可以拆成一套可复用的「模式」——窗户该多高、街区该多大。1994 年,Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides(即「四人组」GoF)把这套思想搬进面向对象编程,出版了《设计模式:可复用面向对象软件的基础》,给出 23 个模式。此后又有几十种模式被陆续发现,并蔓延到面向对象之外的领域。

但模式从诞生起就伴随争议。Refactoring.Guru 归纳了三点:① Paul Graham 的「锤子论」——模式常常是为缺失的语言特性打的补丁(典型如 Strategy,在现代 Java 里一个 lambda 就能替代);② 模式容易沦为教条,被「全心全意」套用而不顾项目实际;③ 不当使用——「手里只有一把锤子,看什么都像钉子」。这恰恰提醒我们:模式是权衡,不是银弹。

本文立场:以 iluwatar/java-design-patterns 仓库的 192 个真实模式为素材(每个都有可运行的 Java 实现),以 GoF 三族(创建 / 结构 / 行为)为逻辑骨架,向上延伸出并发与架构的长尾。同时把它与已经整理的「26 条设计原则」「53 条定律」连成一张知识地图——原则是为什么,模式是怎么做;除 GoF 23 外的 169 个模式另有 《超越 GoF 的 169 个模式 · 详细介绍》 逐模式展开。

01分类地图与抽象层级

所有模式可按意图归为三大经典族(GoF),但仓库的真正价值在于三大族之外那条长长的「尾巴」——并发、企业集成与架构。

抽象层级 ↑(模式所「解决」的问题,从「一个对象」放大到「整个系统」) ① 对象级 · GoF 23 Factory · Builder · Adapter · Decorator · Observer · Strategy · State · Command · Iterator … ② 并发与线程级 · ~20 Producer-Consumer · Thread Pool · Double-Checked Locking · Reactor · Leader/Followers · Balking … ③ 企业集成与数据级 · ~30 DAO · DTO · Repository · Unit of Work · Data Mapper · Specification · Transaction Script … ④ 架构级 · ~40 MVC/MVP/MVVM · 微服务家族 · 六边形/整洁/洋葱 · CQRS · Saga · Event Sourcing · API Gateway … 越往上,模式约束的范围越大、越「软」、越依赖组织与运维;越往下,越贴近语法与单对象。
图 1 · 抽象层级演进。GoF 诞生于 1994 年单线程桌面时代,它的 23 个没有一个是真正用来解决「多线程」或「分布式」的;仓库里多出来的 169 个,几乎都长在这条向上的尾巴上。

四条主线的张力

主线 回答的根本问题 典型模式
创建 「谁来决定对象怎么生、何时生」——解耦实例化与使用方 Factory Method · Abstract Factory · Builder · Prototype · Singleton
结构 「对象如何组合成更大结构,却仍保持灵活」——用组合对抗继承僵化 Adapter · Bridge · Composite · Decorator · Facade · Flyweight · Proxy
行为 「职责与沟通归谁」——一个动作该由谁负责、状态归谁管 Strategy · Observer · State · Command · Template · Iterator · Mediator · Visitor
并发/架构 「多执行流 / 多服务如何协作且不崩」——超出单对象的系统级问题 CQRS · Saga · Circuit Breaker · 六边形 · 微服务 · Reactor
GoF 23 的三族构成(1994) 创建型 5 结构型 7 行为型 11
图 1b · GoF 的 23 个全部落在「对象级」,且只覆盖创建 / 结构 / 行为三族。后续所有的「长尾」模式,都出现在这些族之外。

02创建型:谁来决定「生」

创建型解决的是同一处张力——把「实例化逻辑」从「使用方」手里夺回来。一旦调用方写死 new ConcreteA(),它就被钉死在这个类上;创建型把「生」的决定权上移,让使用方只依赖抽象。

C1工厂方法 Factory Method让子类决定实例化哪一个类

返回 factoryMethod «abstract» Creator ConcreteCreator «abstract» Product ConcreteProduct
子类 ConcreteCreator 实现 Creator 的工厂方法,返回 ConcreteProduct;Creator 只依赖抽象 Product,调用方解耦具体类。

定义一个创建对象的接口,但把「具体造哪个」留给子类。调用方依赖的是「工厂方法」而非具体类。

这是解耦实例化最常用的起点:框架提供骨架,应用方注入具体产品。它与依赖倒置(DIP)天然契合——高层模块只认抽象工厂与抽象产品。

C2抽象工厂 Abstract Factory创建一组相互关联的产品族

创建 Client «interface» AbstractFactory ConcreteFactory «abstract» AbstractProductA «abstract» AbstractProductB ConcreteProductA
Client 只认识抽象工厂与抽象产品;ConcreteFactory 一次性造齐配套的产品族,保证跨产品兼容。

当系统需要「一套配套的对象」(如跨平台的 UI 控件、一套天地鬼神的 DAO 实现),用一个工厂把整族产品一次性造齐,保证它们之间兼容。

关键是「产品族」概念:它约束了一组对象必须配套出现,避免混搭出错。代价是新增一个产品种类要改动所有工厂接口——这也是开闭原则在此处的真实代价。

C3建造者 Builder / Step Builder分步骤构造复杂对象

持有 建造 Director «interface» Builder ConcreteBuilder Product
Director 用 Builder 接口分步构造,ConcreteBuilder 负责具体拼装;构造过程与最终表示分离。

当构造参数爆炸(十几个可选字段),用 Builder 把「构造过程」与「最终表示」分离;Step Builder 进一步用流式 API 把每一步变成类型安全的链式调用。

现代演化:Java 17 的 record + 具名构造参数在一定程度上削弱了 Builder 的必要性,但对「多步、可校验、部分必填」的构造,Builder 依然清晰。

C4原型 Prototype通过克隆已有实例来创建新实例

clone «interface» Prototype ConcretePrototype Client
Client 通过克隆已有 Prototype 实例得到新对象,避免昂贵的从零构造。

当「从零 new」成本高、或要复制的对象构造逻辑复杂,直接克隆一个已配置好的原型更高效。

C5单例 Singleton全局唯一实例——也是最易被滥用的一个

getInstance Singleton Client
全局唯一实例 + 全局访问点;现代由 DI 容器以单例作用域管理,代码不再手写 getInstance()。

保证一个类只有一个实例,并提供一个全局访问点。仓库里还衍生出 multiton(按 key 多实例)、monostate(多实例共享同一状态)。

现代反思:手写单例(尤其是 double-checked locking 版)在测试中是灾难——隐式全局依赖让单测无法隔离。今天的答案几乎总是依赖注入容器:让容器以「单例作用域」来管理生命周期,代码里不再出现 getInstance()。单例从「自己实现」退化成了「框架配置」。

这条家族的现代终点是依赖注入 Dependency Injection:它把「谁负责装配所有对象」这个最难的创建问题,彻底交给容器。仓库中 dependency-injection、factory、factory-kit、abstract-document、object-pool、lazy-loading 都属于同一条脉络。

03结构型:如何让「合」而不「僵」

结构型的核心是组合优于继承的工程落地:在运行时把对象拼成更大的结构,却不让结构变成一整块改不动的石头。

S1适配器 Adapter把一个接口「翻译」成另一个

request→specificRequest «interface» Target Adapter Adaptee
Adapter 实现 Target 接口,内部把请求翻译给 Adaptee,让不兼容接口协同工作。

旧系统、第三方库、不同版本的 API 往往接口不兼容。Adapter 在不改双方源码的前提下做接口转换——它是老旧系统接入新世界的「接生婆」。

S2装饰器 Decorator运行时给对象叠加能力,而非继承爆炸

持有 «interface» Component ConcreteComponent «abstract» Decorator ConcreteDecoratorA ConcreteDecoratorB
Decorator 实现 Component 并持有另一个 Component,运行时嵌套叠加职责,避免继承爆炸。

要给一个对象加日志、加缓存、加事务、加权限,如果用继承,组合数会指数爆炸(LogCachedSecureXxx)。Decorator 用「包裹」在运行时层层叠加,每个装饰只关心自己那一件事。

现代演化:Spring 的 AOP + 注解,本质就是把 Decorator 变得近乎透明——你写 @Transactional,框架替你包了一层代理。这与「不可见代理」是同一思路。

S3代理 Proxy控制对原对象的访问

控制访问 «interface» Subject RealSubject Proxy
Proxy 实现与 RealSubject 相同的 Subject 接口,在调用前后插入控制逻辑(延迟/鉴权/日志)。

远程代理、虚拟代理(lazy loading)、保护代理、动态代理——都是在「访问」这件事上做文章。仓库中 virtual-proxy、dynamic-proxy 是它最实用的两个分支。

S4桥接 Bridge把「抽象」与「实现」彻底脱钩

持有 «abstract» Abstraction RefinedAbstraction «interface» Implementor ConcreteImplementorA ConcreteImplementorB
抽象(Abstraction)与实现(Implementor)各自独立演化,通过组合在运行时桥接,互不影响维度。

当一个类有两个独立变化的维度(如「形状」×「颜色」、「消息」×「发送渠道」),Bridge 用组合替代多层继承,让两个维度各自演化、互不牵制。

S5外观 Facade / 组合 Composite降维复杂度 / 树形递归统一处理

children «interface» Component Leaf Composite
Leaf 与 Composite 都实现 Component;Composite 递归持有 children,客户端统一对待单对象与组合。
Client Facade SubsystemA SubsystemB SubsystemC
Facade 为一组子系统提供统一入口,把复杂调用收口,客户端只依赖 Facade 而非众多子系统。

Facade 为复杂子系统提供一个简单入口,把「调用方要懂 10 个类」降成「调用方只懂 1 个门面」。Composite 让「单个对象」与「对象容器」对调用方一视同仁,递归结构(菜单、DOM、文件系统)因此可以统一遍历。

同族还有 flyweight(共享细粒度对象,以空间换性能)、private-class-data、twin、front-controller、composite-view、composite-entity、delegation、converter、marker-interface。它们的共同点:都在重塑「对象之间的拼法」。

04行为型:职责与沟通的归属

行为型回答的是「一个动作该由谁负责、状态归谁管、对象间怎么说话」。GoF 11 个行为模式里,有一半在解决同一类问题:把「if-else 的硬分支」换成「可替换的对象」。

B1策略 Strategy把算法族做成可互换的对象

持有 Context «interface» Strategy ConcreteStrategyA ConcreteStrategyB ConcreteStrategyC
Context 持有 Strategy,运行时可换具体策略;算法族成为可互换对象,消除条件分支。

排序、压缩、计费、校验……同一意图下的多种算法,抽成统一接口,运行时切换。

对照 Graham 的批评:在支持一等函数的现代语言里,Strategy 常常退化成「传一个 lambda」。list.sort(comparator) 就是策略模式,只是没了那个 interface。这恰恰是「模式是对缺失语言特性的补丁」的最佳例证——它没消失,只是被语言吸收进了语法。

B2观察者 Observer / 事件驱动一对多的状态通知

通知 拉状态 «abstract» Subject ConcreteSubject «interface» Observer ConcreteObserver Client
Subject 维护 Observer 列表,状态变化 notify 所有观察者;观察者按需拉取状态,解耦发布与订阅。

一个对象状态变化,自动通知所有关心者。这是 GUI、消息总线、响应式编程的共同祖先。仓库中 observer、publish-subscribe、event-aggregator、event-based-asynchronous 都是它的变体。

B3状态 State把「状态」变成对象,消除状态分支

持有当前 Context «interface» State ConcreteStateA ConcreteStateB
把状态封装成对象,Context 委托当前 State 处理请求;切换状态即替换对象,消除状态分支。

订单的「待支付/已支付/已发货/已完成」如果全写在一个类里,就是一长串 if (state == ...)。State 模式让每个状态成为独立对象,行为随状态切换而自然迁移——本质是一个隐式状态机。

B4命令 Command把「请求」封装成对象

action() 持有 Client Invoker «interface» Command ConcreteCommand Receiver
把请求封装成 Command 对象,Invoker 持有一或多个命令;支持参数化、排队、撤销。

一旦「做什么」成了对象,它就可以被排队、撤销、重放、记录日志、跨网络传输。这是 undo/redo、任务队列、事务性消息(transactional-outbox)的共同基础。它与 CQRS、Saga 在架构层是一脉相承的。

B5模板方法 / 迭代器 / 中介者 / 访问者骨架、遍历、调度、双分派

«abstract» AbstractClass ConcreteClass
AbstractClass 定义骨架 templateMethod 与抽象原语操作,ConcreteClass 只填具体步骤。
createIterator «interface» Aggregate ConcreteAggregate «interface» Iterator ConcreteIterator
Aggregate 提供 createIterator,Iterator 封装遍历;遍历逻辑与集合结构解耦。
notify notify «interface» Mediator ConcreteMediator «abstract» Colleague ConcreteColleagueA ConcreteColleagueB
Colleague 不再互相引用,统一通过 Mediator 通信,把网状依赖收敛成星型。
accept accept «interface» Visitor ConcreteVisitor «interface» Element ConcreteElementA ConcreteElementB
Element.accept(Visitor) 把自身回传给 Visitor,实现双分派;新增操作不改元素类。

Template Method 定好算法骨架、留钩子给子类;Iterator 把「怎么遍历」与「遍历什么」解耦(现代 for-each 已内置);Mediator 用一个人集中调度,切断对象间的网状依赖;Visitor 用双分派把「稳定的结构」与「易变的操作」分开,新增操作不必改结构类。

行为族在仓库中长得最茂密:chain-of-responsibility、command、commander、interpreter、memento、null-object(用空对象消除 null 判断)、servant、specification、callback、collection-pipeline、combinator、fluent-interface 等都在此列。

05超越 GoF:并发与架构的长尾

如果说 GoF 是「对象级别的手艺」,那么仓库多出来的那 169 个模式,几乎都在回答一个 1994 年没人认真问的问题: 当系统里有多个执行流、多台机器时,怎么办?这就是模式的疆域从「对象」放大到「系统」的过程。

下面每个分支只列名字与归组。《超越 GoF 的 169 个模式 · 详细介绍》 对每个模式给出「核心意图 + 适用场景 + 关联」三段式卡片与主线配图。
1994 → 2026:模式数量 23 → 192,新增 169 几乎全在「长尾」 GoF 23(对象级) 23 长尾 169(按主线拆分,部分为约数) 并发 21 架构 40 企业数据 29 函数式 23 其他 56 注:五主线宏观约数,少量模式跨类,合计 = 169 非 GoF(=192−23)。
图 3 · GoF 的 23 是「对象级别的手艺」;真正让数量翻到 192 的,是并发、架构、企业集成与函数式这几条 1994 年还不存在(或未被命名)的尾巴。

并发与线程级:让多执行流不互相踩踏

这一支里有一整套「线程协作」的词汇:producer-consumer(用队列解耦生产与消费)、thread-pool-executor(复用线程、限流)、double-checked-locking(懒加载单例的并发安全写法)、active-object(把方法调用变成消息,串行化到专用线程)、reactor(事件循环、非阻塞)、leader-followers、balking、guarded-suspension、backpressure、fork-join、map-reduce、poison-pill。它们对应着现代高并发框架(Netty、Reactor、线程池)的底层心智模型。

X1断路器 Circuit Breaker故障时的「快速失败」,而非盲目重试

调用 转发/快速失败 Client CircuitBreaker Service
故障率超阈值时断路器跳到 Open,直接拒绝并快速失败;半开试探恢复,避免盲目重试雪崩。

下游反复超时,若还傻傻重试,会把调用方自己也拖死。断路器在失败率超阈值时「跳闸」,直接拒绝请求并进入半开探测。它是对墨菲定律(凡可能出错的终将出错)的工程回应:把异常路径当成一等公民。

X2Saga / 事务性发件箱分布式下的一致性妥协

失败时反向补偿 Saga Step1 Step2 Step3 Compensate
把分布式事务拆成本地事务序列,每步带补偿;任一步失败则按相反顺序执行补偿,达成最终一致。

跨多个微服务的「事务」无法用数据库 2PC(性能与可用性代价太高)。Saga 把大事务拆成一串本地事务,失败时按相反顺序执行补偿;transactional-outbox 则保证「写库」与「发消息」的最终一致。它们是对「强一致不可得」的务实承认。

架构级:把系统本身当成设计对象

这一支直接决定「代码怎么分层、服务怎么切」:model-view-controller / model-view-presenter / model-view-viewmodel / model-view-intent(UI 架构四兄弟)、layered-architecture、hexagonal-architecture(端口与适配器)、clean-architecture、onion-architecture、以及庞大的微服务家族(microservices-api-gateway、backends-for-frontends、microservices-bulkhead、microservices-distributed-tracing 等)。

X3CQRS + 六边形架构读写分离 / 端口与适配器

Client CommandSide QuerySide WriteStore ReadStore
写模型与读模型分离,各自优化;六边形以端口/适配器隔离内外,应用核心不依赖框架。

CQRS(命令查询职责分离)把「写模型」与「读模型」拆开,各自优化——这正是原则页里「命令查询分离(CQS)」在架构层的放大。六边形架构用「端口 + 适配器」把业务逻辑围在中心、把数据库/UI/消息都变成可替换的外围,与依赖倒置(DIP)、接口隔离(ISP)是同一哲学的不同尺度表达。

升华:把 GoF 的 23 个与这 169 个并排放,会看见一条清晰的「抽象层级爬升曲线」——模式所解决的问题,从「一个对象的职责」,一步步上升到「一个服务的边界」,再到「一群服务的协作」。模式不是在变多,而是软件要操心的事变大了。

06模式的「道」:与原则、定律的互文

模式不该被孤立阅读。把本系列已经梳理的两份材料拼进来,会浮现一张完整的认知地图:原则是「道」(为什么),模式是「法」(怎么做),重构手法是「术」,工具与框架是「器」。五层叠合,才是一个工程师真正可用的全景。

道 · 为什么 26 条设计原则(SOLID/DRY/KISS/…) · 53 条定律与理论(康威/墨菲/布鲁克斯/奥卡姆…) 法 · 怎么做 192 个设计模式(本文) · 原则与模式在「法」层重叠:OCP↔装饰器/策略,DIP↔工厂/六边形 术 · 落到手 重构手法(提取方法/以多态替分支/引入参数对象…) · 识别「异味→模式」的实操 器 · 用什么 Spring / Redis / K8s / Maven / IDE 重构工具——定律集与原则集都缺「器」,由工程实践补全 势 · 横贯 摩尔/技术成熟度曲线/康威——客观规律,决定模式在什么「势」下才划算
图 2 · 道法术器势 × 内容来源。五层各自回答「为什么 / 怎么做 / 落到手 / 用什么」,而「势」横贯全程——这正是之前《53 条定律》一文里的同一框架,此处把模式填进了「法」层。

具体的互文线索

设计原则(道) 对应模式(法) 背后的定律(势)
开闭原则 OCP 策略 / 装饰器 / 观察者 复杂性守恒——改一处不波及其他
依赖倒置 DIP / 接口隔离 ISP 工厂方法 / 适配器 / 六边形架构 得墨忒耳定律——只依赖需要依赖的
单一职责 SRP 中介者 / 命令 / 服务层 康威定律——模块边界≈团队边界
命令查询分离 CQS CQRS / Command 模式 墨菲定律——读写混在一起更易出错
组合优于继承 装饰器 / 组合 里氏替换 LSP——继承是强耦合赌注
几条定律如何「框定」模式:① 康威定律——你的微服务切分,最终会长得像你的组织架构;这是架构模式无法回避的外部约束。② 墨菲定律——解释为什么需要断路器、重试、幂等(microservices-idempotent-consumer)、容错模式。③ 林纳斯定律——「足够多的眼睛让缺陷浅显」,模式作为共享词汇,正是降低阅读门槛、让评审有效的工具;但 布鲁克斯法则 提醒:加人不能加速,过度模式化反而抬高沟通成本。

07何时不用模式

知道一个模式,和知道何时收手,是两件事。模式是权衡,引入它的成本(理解成本、间接层、改动成本)必须被它的收益覆盖。

三类典型反模式:
  • 单例当全局变量:把隐式依赖藏进 getInstance(),单测无法隔离、调用链不可见。能用 DI 就不要手写单例。
  • 为「未来可能」提前上模式:违反 YAGNI——抽象的代价在它还不需要时就已支付(对应「过早优化」定律)。
  • 硬套「是一个」而忽略组合:强行继承破坏里氏替换(LSP),导致子类背着父类的契约包袱。
  • 过度分层:一个请求穿过 8 层才到 DB,可读性与性能双输——与「简单」「快速」直接冲突。

引入一个模式前的三问

# 问题 若答「否」
① 这里真的存在「反复出现的问题」吗? 只是一次性的特例,直接写清楚就好
② 模式是否恰好匹配意图,还是「手里只有锤子」? 退一步,先用最简单可行的写法
③ 引入后,增删一个变化点的成本是否真的下降? 若间接层反而让改动更难,撤掉它

一句话:模式是「被命名的最佳实践」,不是「必须打卡的 KPI」。当它让代码更简单、变更更局部,才配得上这个名字。

08实践清单:从代码异味到模式

把抽象落成直觉。下面是评审代码时最常见的「异味 → 对应模式」对照,以及一份可直接用的评审清单。

代码异味 值得考虑的模式
满屏 new ConcreteX(),且具体类常变 Factory / Abstract Factory / Dependency Injection
构造函数的参数长到离谱 Builder / Step Builder
大量 if (type == A) … else if (type == B) Strategy / State / Visitor
日志 / 事务 / 鉴权等横切逻辑反复粘贴 Decorator / Proxy / AOP
一个对象变化要通知一堆其他对象 Observer / Publish-Subscribe / EventBus
复杂的条件组合查询 Specification
多步、可撤销的操作 Command(配合 Memento)
大对象图的统一遍历 Iterator / Composite
跨服务的一致性 Saga / Transactional Outbox / CQRS
下游不稳定,反复重试拖垮自己 Circuit Breaker / Bulkhead / Retry

评审清单(五条)

  1. 意图先行:这段代码要解决的「反复出现的问题」是什么?能一句话说清吗?
  2. 耦合检查:改动一个变化点,会不会牵动不相关的模块?(用得墨忒耳 / 隐藏实现细节审视)
  3. 可替换性:子类型能否无缝替换基类?(里氏替换 LSP)
  4. 对扩展开放:新增一种情况,是「加一个类」还是「改一堆 switch」?(开闭 OCP)
  5. 收手意识:这个模式带来的间接层,真的被它的收益覆盖了吗?(YAGNI / KISS 兜底)

09192 模式全景索引

以下按意图归类,列出仓库中的主要模式(每个链接到 java-design-patterns.com 对应页面)。部分模式跨类,此处按其主要意图归置;分组口径为本次整理的分析视角。

逐模式详介:上面仅为列名与归组。《超越 GoF 的 169 个模式 · 详细介绍》 对除 GoF 23 外的全部 169 个模式,给出「核心意图 + 适用场景 + 关联」三段式卡片,并配主线示意图(并发协作 / 架构谱系 / 数据持久 / 函数组合)。

创建型 Creational

abstract-factory · abstract-document · builder · factory · factory-kit · factory-method · lazy-loading · multiton · monostate · object-pool · prototype · singleton · step-builder · dependency-injection

结构型 Structural

adapter · bridge · composite · composite-view · composite-entity · converter · decorator · delegation · facade · flyweight · front-controller · marker-interface · private-class-data · proxy · twin · virtual-proxy · dynamic-proxy

行为型 Behavioral

callback · chain-of-responsibility · collection-pipeline · command · commander · combinator · currying · fluent-interface · function-composition · interpreter · iterator · mediator · memento · null-object · observer · servant · specification · state · strategy · template-method · trampoline · visitor

并发与线程级 Concurrency

active-object · async-method-invocation · backpressure · balking · double-checked-locking · fork-join · guarded-suspension · half-sync-half-async · leader-election · leader-followers · lockable-object · map-reduce · monitor · optimistic-offline-lock · poison-pill · polling-publisher · producer-consumer · promise · reactor · thread-pool-executor · thread-specific-storage

架构级 Architectural

model-view-controller · model-view-presenter · model-view-viewmodel · model-view-intent · layered-architecture · hexagonal-architecture · clean-architecture · onion-architecture · monolithic-architecture · event-driven-architecture · event-sourcing · command-query-responsibility-segregation · saga · api-gateway · backends-for-frontends · circuit-breaker · client-session · service-locator · service-layer · business-delegate · gateway · ambassador · strangler · anti-corruption-layer · separated-interface · page-controller · service-to-worker · presentation-model · templateview · view-helper · intercepting-filter · 以及 microservices-* 系列(aggregrator / api-gateway / bulkhead / client-side-ui-composition / distributed-tracing / idempotent-consumer / load-shedding / log-aggregation / messaging / self-registration)

企业集成与数据 Enterprise & Data

data-access-object · data-bus · data-locality · data-mapper · data-transfer-object · domain-model · dirty-flag · identity-map · metadata-mapping · object-mother · parameter-object · partial-response · registry · repository · serialized-entity · serialized-lob · server-session · service-stub · session-facade · single-table-inheritance · special-case · table-inheritance · table-module · transaction-script · transactional-outbox · unit-of-work · value-object · version-number

函数式与基础 Fundamentals & Functional

immutable · mute-idiom · type-object · role-object · extension-objects · monad · money · property · context-object · localization · event-aggregator · event-queue · event-based-asynchronous · publish-subscribe · notification · execute-around · filterer · curiously-recurring-template-pattern · bytecode · resource-acquisition-is-initialization · double-dispatch · update-method · game-loop

10结语与资源

模式从不承诺「写出更好的代码」,它只承诺「当我们用同一个名字说话时,误解会少一点」。

从 GoF 的 23 到今天的 192,数字增长的背后是软件所操心的事越来越大:从「一个对象怎么生、怎么合、怎么说话」,一路爬升到「一群服务怎么协作、怎么在故障中存活」。模式不是知识的终点,它是一张共享词汇表——让你在评审会上说「这里用装饰器就够」,而不必解释装饰器是什么。

但请记住那条贯穿本文的底线:模式是权衡,不是银弹。把它放进「道(为什么)—法(怎么做)—术(落到手)—器(用什么)—势(横贯的客观规律)」的全景里,它才有意义。脱离上下文地套用,只会收获更厚的间接层与更慢的团队。

资料来源与延伸阅读
① 主线仓库:github.com/iluwatar/java-design-patterns(本地检出在 Open/java-design-patterns,192 个模式均含可运行 Java 实现)。
② 模式目录站:java-design-patterns.com/zh/patterns/(每个模式的中文详解)。
③ 经典分类与争议:refactoring.guru 设计模式(创建/结构/行为三族,及「模式的争议」一节)。
④ 本系列互文:26 条软件设计原则 · 53 条定律 / 理论 / 原则 / 模式归纳。
⑤ 非 GoF 详介:超越 GoF 的 169 个模式 · 详细介绍(本文配套,除 GoF 23 外逐模式三段式卡片 + 配图)。
⑤ 导航与样式参考:Software-Engineering-Laws-Theories-Principles-and-Patterns/index.html(同一套 toolbar / 目录 / 三态主题机制)。

本文以仓库真实模式为骨架、以两站点为权威印证,对 GoF 三族做了深度剖析并向上延伸到并发与架构的长尾;分组与「道法术器势」映射为本次整理的增值视角,具体模式归属可跨类讨论。