设计模式应该怎么学

文章目录

  • 真正学会设计模式的正确路径(超简单)
    • [第一步:先学 5 大设计原则](#第一步:先学 5 大设计原则)
    • [第二步:只学最常用 8 种](#第二步:只学最常用 8 种)
    • [第三步:**每个模式只记一句话 + 一个业务场景**](#第三步:每个模式只记一句话 + 一个业务场景)
    • [第四步:在 Spring / MyBatis / JDK 里找模式](#第四步:在 Spring / MyBatis / JDK 里找模式)
      • [1. 单例模式(Singleton)](#1. 单例模式(Singleton))
      • [2. 工厂 / 抽象工厂(Factory)](#2. 工厂 / 抽象工厂(Factory))
      • [3. 策略模式(Strategy)](#3. 策略模式(Strategy))
      • [4. 模板方法(Template)](#4. 模板方法(Template))
      • [5. 适配器模式(Adapter)](#5. 适配器模式(Adapter))
      • [6. 装饰器模式(Decorator)](#6. 装饰器模式(Decorator))
      • [7. 观察者模式(Observer)](#7. 观察者模式(Observer))
      • [8. 建造者模式(Builder)](#8. 建造者模式(Builder))
  • 三、一句大实话

设计模式本身就不是"靠背"的东西 ,它难,是因为它的 打开方式不对

真正学会设计模式的正确路径(超简单)

第一步:先学 5 大设计原则

不用背,理解意思就行:

  • 单一职责:一个类只干一件事
  • 开闭原则:扩展开放,修改关闭
  • 里氏替换:子类能替换父类
  • 接口隔离:接口小而专
  • 依赖倒置:依赖抽象,不依赖细节

原则懂了,模式自然懂。

第二步:只学最常用 8 种

其他全部暂时扔掉:

  1. 单例(Singleton)
  2. 工厂/抽象工厂(Factory)
  3. 策略(Strategy)
  4. 模板方法(Template)
  5. 适配器(Adapter)
  6. 装饰器(Decorator)
  7. 观察者(Observer)
  8. 建造者(Builder)

第三步:每个模式只记一句话 + 一个业务场景

比如:

  1. 单例(Singleton)

    一句话:全局只创建一个对象,避免重复实例浪费资源。

    场景:项目中的线程池、连接池、配置工具类,整个系统只需要一份。

  2. 工厂/抽象工厂(Factory)

    一句话:把创建对象的逻辑封装起来,外部只需要拿产品,不用关心怎么 new。

    场景:系统接入支付宝、微信、云闪付,通过工厂统一获取不同支付实例。

  3. 策略(Strategy)

    一句话:定义一组可互换的算法,运行时灵活切换不同实现。

    场景:订单结算支持原价、折扣、满减、会员价等多种计价方式自由切换。

  4. 模板方法(Template)

    一句话:固定业务流程骨架,可变步骤交给子类实现。

    场景:统一的审核流程(提交→校验→审批→通知),不同业务只自定义校验逻辑。

  5. 适配器(Adapter)

    一句话:把不兼容的接口包装一层,转换成目标接口,让系统能无缝使用。

    场景:对接多个第三方短信服务商,通过适配器统一成一套 sendSms 接口。

  6. 装饰器(Decorator)

    一句话:不修改原有类,动态给对象叠加额外功能。

    场景:给基础的 API 服务依次添加日志、限流、缓存、加密等增强能力。

  7. 观察者(Observer)

    一句话:一个对象状态变化,自动通知所有依赖它的对象。

    场景:用户下单支付成功后,自动通知库存扣减、发送短信、推送消息、生成账单

  8. 建造者(Builder)

    一句话:分步构建复杂对象,链式调用,结构清晰。

    场景:构建复杂的查询条件、订单参数、Http请求对象,用链式优雅拼装属性。

第四步:在 Spring / MyBatis / JDK 里找模式

你天天用,只是没意识到:

1. 单例模式(Singleton)

一句话:全局唯一实例

  • Spring@Scope("singleton"),所有默认 Bean 都是单例
  • MyBatisSqlSessionFactory 全局唯一
  • JDKRuntime.getRuntime()Desktop.getDesktop()

2. 工厂 / 抽象工厂(Factory)

一句话:封装对象创建,不直接new

  • SpringBeanFactoryApplicationContext
  • MyBatisSqlSessionFactory 创建 SqlSession
  • JDKLoggerFactory.getLogger()BeanFactory

3. 策略模式(Strategy)

一句话:算法可互换,运行时切换

  • SpringResourceLoader(切换文件/网络/classpath资源)
  • MyBatisStatementHandler(切换PreparedStatement/CallableStatement)
  • JDKComparator 比较器、ThreadPoolExecutor 拒绝策略

4. 模板方法(Template)

一句话:固定流程骨架,子类填细节

  • SpringJdbcTemplateRedisTemplateRestTemplate
  • MyBatisBaseExecutor
  • JDKHttpServlet(doGet/doPost)、AbstractList

5. 适配器模式(Adapter)

一句话:接口不兼容,包一层转换

  • SpringHandlerInterceptorAdapterWebMvcConfigurerAdapter
  • MyBatisLogAdapter(适配Log4j/Slf4j)
  • JDKArrays.asList()InputStreamReader(字节转字符)

6. 装饰器模式(Decorator)

一句话:动态增强,不改原类

  • SpringSessionAutoFlushProxyBeanWrapper
  • MyBatisCachingExecutor 给执行器加缓存
  • JDKBufferedReaderBufferedInputStreamDataInputStream

7. 观察者模式(Observer)

一句话:一个变化,自动通知一堆

  • SpringApplicationEvent + ApplicationListener
  • MyBatisInterceptor 拦截器
  • JDKEventListenerButton.addActionListener

8. 建造者模式(Builder)

一句话:链式构造复杂对象

  • SpringBeanDefinitionBuilderMockMvc
  • MyBatisSqlSessionFactoryBuilderCacheBuilder
  • JDKStringBuilderLombok @Builder

一看源码,瞬间顿悟。

三、一句大实话

设计模式不是学问,是"工程经验"。
你写得多、踩坑多、重构多,自然就懂了。

强行背定义只会越学越痛苦。

相关推荐
故事和你91几秒前
洛谷-算法2-2-常见优化技巧1
开发语言·数据结构·c++·算法·动态规划·图论
酉鬼女又兒2 分钟前
JavaLeetCode 第一题「两数之和」:从暴力枚举到一遍哈希表的正确与错误实现,详解HashMap核心知识点及常见陷阱
java·开发语言·数据结构·算法·leetcode·职场和发展·散列表
JackSparrow4144 分钟前
彻底理解Java NIO(一)C语言实现 单进程+多进程+多线程 阻塞式I/O 服务器详解
java·linux·c语言·网络·后端·tcp/ip·nio
小江的记录本5 分钟前
【微服务与云原生架构】Serverless架构、FaaS/BaaS、核心原理、优缺点
java·后端·微服务·云原生·架构·系统架构·serverless
谢谢 啊sir7 分钟前
L2-060 大语言模型的推理 - java
java·人工智能·语言模型
白夜11179 分钟前
C++(mixins 混入模式)
开发语言·c++·笔记
无风听海12 分钟前
Python 哨兵值模式(Sentinel Value Pattern)深度解析
开发语言·python·sentinel
清风玉骨13 分钟前
C++/Qt从零开始编译使用libxlsxwriter库
开发语言·qt
下地种菜小叶14 分钟前
特征定义、特征计算、特征服务怎么配合?一次讲透
java·服务器·前端·数据库·spring cloud
报错小能手16 分钟前
Swift UI 用 MVVM 架构 Combine EventBus 实现待办清单
开发语言·ui·swift