设计模式应该怎么学

文章目录

  • 真正学会设计模式的正确路径(超简单)
    • [第一步:先学 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

一看源码,瞬间顿悟。

三、一句大实话

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

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

相关推荐
wb043072013 小时前
使用 Java 开发 MCP 服务并发布到 Maven 中央仓库完整指南
java·开发语言·spring boot·ai·maven
良木生香4 小时前
【C++初阶】:C++类和对象(下):构造函数promax & 类型转换 & static & 友元 & 内部类 & 匿名对象 & 超级优化
c语言·开发语言·c++
5系暗夜孤魂4 小时前
系统越复杂,越需要“边界感”:从 Java 体系理解大型工程的可维护性本质
java·开发语言
二月夜4 小时前
Spring循环依赖深度解析:从三级缓存原理到跨环境“灵异”现象
java·spring
无巧不成书02184 小时前
C语言零基础速通指南 | 1小时从入门到跑通完整项目
c语言·开发语言·编程实战·c语言入门·零基础编程·c语言速通
nbwenren5 小时前
Springboot中SLF4J详解
java·spring boot·后端
三雷科技5 小时前
使用 `dlopen` 动态加载 `.so` 文件
开发语言·c++·算法
wellc5 小时前
java进阶知识点
java·开发语言
听风吹等浪起5 小时前
用Python和Pygame从零实现坦克大战
开发语言·python·pygame